From 6e552c2ef1f43ee1d7fb5526efbe134418171ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ertu=C4=9Frul=20Top=C3=A7u?= Date: Thu, 3 Sep 2026 16:38:04 +0300 Subject: [PATCH] Initial Refleks Lite hardware and firmware release --- .gitignore | 26 + ArcadeStick_hardware/ArcadeStick.BomDoc | 54 + ArcadeStick_hardware/ArcadeStick.OutJob | 181 + ArcadeStick_hardware/ArcadeStick.PrjPcb | 1319 ++ ArcadeStick_hardware/ArcadeStick.pdf | Bin 0 -> 672545 bytes ArcadeStick_hardware/FabDocuments.zip | Bin 0 -> 35113 bytes ArcadeStick_hardware/Job1.OutJob | 186 + ArcadeStick_hardware/LICENSE | 199 + ArcadeStick_hardware/PCB1.PcbDoc | Bin 0 -> 2903040 bytes ArcadeStick_hardware/Sheet1.SchDoc | Bin 0 -> 515584 bytes LICENSE | 12 + README.md | 283 + arcadestick_software/.clangd | 2 + arcadestick_software/.gitignore | 9 + arcadestick_software/.mxproject | 40 + .../.settings/bundles-lock.store.json | 246 + .../.settings/bundles.store.json | 28 + .../com.st.stm32cube.ide.mcu.sfrview.prefs | 2 + arcadestick_software/.settings/ide.store.json | 9 + .../.settings/language.settings.xml | 25 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/stm32cubeide.project.prefs | 3 + .../.vscode/c_cpp_properties.json | 8 + arcadestick_software/.vscode/extensions.json | 6 + arcadestick_software/.vscode/launch.json | 62 + arcadestick_software/.vscode/settings.json | 18 + arcadestick_software/.vscode/tasks.json | 41 + arcadestick_software/CMakeLists.txt | 229 + arcadestick_software/CMakePresets.json | 35 + arcadestick_software/Core/Inc/dinput_app.h | 6 + arcadestick_software/Core/Inc/main.h | 101 + .../Core/Inc/stm32f1xx_hal_conf.h | 391 + arcadestick_software/Core/Inc/stm32f1xx_it.h | 67 + arcadestick_software/Core/Inc/xinput_app.h | 6 + .../Core/Src/bootloader_main.c | 155 + arcadestick_software/Core/Src/dinput_app.c | 66 + arcadestick_software/Core/Src/main.c | 530 + .../Core/Src/stm32f1xx_hal_msp.c | 85 + arcadestick_software/Core/Src/stm32f1xx_it.c | 217 + arcadestick_software/Core/Src/syscalls.c | 176 + arcadestick_software/Core/Src/sysmem.c | 79 + .../Core/Src/system_stm32f1xx.c | 406 + arcadestick_software/Core/Src/xinput_app.c | 95 + arcadestick_software/DFU.md | 36 + .../Device/ST/STM32F1xx/Include/stm32f103xb.h | 10240 ++++++++++++++++ .../Device/ST/STM32F1xx/Include/stm32f1xx.h | 273 + .../ST/STM32F1xx/Include/system_stm32f1xx.h | 96 + .../CMSIS/Device/ST/STM32F1xx/LICENSE.txt | 6 + .../Drivers/CMSIS/Include/cmsis_armcc.h | 865 ++ .../Drivers/CMSIS/Include/cmsis_armclang.h | 1869 +++ .../Drivers/CMSIS/Include/cmsis_compiler.h | 266 + .../Drivers/CMSIS/Include/cmsis_gcc.h | 2085 ++++ .../Drivers/CMSIS/Include/cmsis_iccarm.h | 935 ++ .../Drivers/CMSIS/Include/cmsis_version.h | 39 + .../Drivers/CMSIS/Include/core_armv8mbl.h | 1918 +++ .../Drivers/CMSIS/Include/core_armv8mml.h | 2927 +++++ .../Drivers/CMSIS/Include/core_cm0.h | 949 ++ .../Drivers/CMSIS/Include/core_cm0plus.h | 1083 ++ .../Drivers/CMSIS/Include/core_cm1.h | 976 ++ .../Drivers/CMSIS/Include/core_cm23.h | 1993 +++ .../Drivers/CMSIS/Include/core_cm3.h | 1941 +++ .../Drivers/CMSIS/Include/core_cm33.h | 3002 +++++ .../Drivers/CMSIS/Include/core_cm4.h | 2129 ++++ .../Drivers/CMSIS/Include/core_cm7.h | 2671 ++++ .../Drivers/CMSIS/Include/core_sc000.h | 1022 ++ .../Drivers/CMSIS/Include/core_sc300.h | 1915 +++ .../Drivers/CMSIS/Include/mpu_armv7.h | 270 + .../Drivers/CMSIS/Include/mpu_armv8.h | 333 + .../Drivers/CMSIS/Include/tz_context.h | 70 + .../Drivers/CMSIS/LICENSE.txt | 201 + .../Inc/Legacy/stm32_hal_legacy.h | 4377 +++++++ .../STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h | 357 + .../Inc/stm32f1xx_hal_cortex.h | 410 + .../Inc/stm32f1xx_hal_def.h | 211 + .../Inc/stm32f1xx_hal_dma.h | 455 + .../Inc/stm32f1xx_hal_dma_ex.h | 275 + .../Inc/stm32f1xx_hal_exti.h | 318 + .../Inc/stm32f1xx_hal_flash.h | 325 + .../Inc/stm32f1xx_hal_flash_ex.h | 783 ++ .../Inc/stm32f1xx_hal_gpio.h | 306 + .../Inc/stm32f1xx_hal_gpio_ex.h | 892 ++ .../Inc/stm32f1xx_hal_pcd.h | 1055 ++ .../Inc/stm32f1xx_hal_pcd_ex.h | 85 + .../Inc/stm32f1xx_hal_pwr.h | 385 + .../Inc/stm32f1xx_hal_rcc.h | 1375 +++ .../Inc/stm32f1xx_hal_rcc_ex.h | 1905 +++ .../Inc/stm32f1xx_ll_bus.h | 1012 ++ .../Inc/stm32f1xx_ll_cortex.h | 638 + .../Inc/stm32f1xx_ll_dma.h | 1958 +++ .../Inc/stm32f1xx_ll_exti.h | 886 ++ .../Inc/stm32f1xx_ll_gpio.h | 2341 ++++ .../Inc/stm32f1xx_ll_pwr.h | 437 + .../Inc/stm32f1xx_ll_rcc.h | 2309 ++++ .../Inc/stm32f1xx_ll_system.h | 575 + .../Inc/stm32f1xx_ll_usb.h | 641 + .../Inc/stm32f1xx_ll_utils.h | 270 + .../Drivers/STM32F1xx_HAL_Driver/LICENSE.txt | 6 + .../STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c | 607 + .../Src/stm32f1xx_hal_cortex.c | 529 + .../Src/stm32f1xx_hal_dma.c | 897 ++ .../Src/stm32f1xx_hal_exti.c | 553 + .../Src/stm32f1xx_hal_flash.c | 959 ++ .../Src/stm32f1xx_hal_flash_ex.c | 1121 ++ .../Src/stm32f1xx_hal_gpio.c | 586 + .../Src/stm32f1xx_hal_gpio_ex.c | 126 + .../Src/stm32f1xx_hal_pcd.c | 2720 ++++ .../Src/stm32f1xx_hal_pcd_ex.c | 243 + .../Src/stm32f1xx_hal_pwr.c | 618 + .../Src/stm32f1xx_hal_rcc.c | 1400 +++ .../Src/stm32f1xx_hal_rcc_ex.c | 860 ++ .../Src/stm32f1xx_ll_usb.c | 2897 +++++ arcadestick_software/LICENSE | 21 + .../Class/HID/Inc/usbd_hid.h | 142 + .../Class/HID/Src/usbd_hid.c | 672 + .../Core/Inc/usbd_core.h | 161 + .../Core/Inc/usbd_ctlreq.h | 105 + .../Core/Inc/usbd_def.h | 348 + .../Core/Inc/usbd_ioreq.h | 119 + .../Core/Src/usbd_core.c | 611 + .../Core/Src/usbd_ctlreq.c | 918 ++ .../Core/Src/usbd_ioreq.c | 216 + arcadestick_software/STM32F103xx_FLASH.ld | 250 + .../USB_DEVICE/App/usb_device.c | 95 + .../USB_DEVICE/App/usb_device.h | 102 + .../USB_DEVICE/App/usb_device_dfu.c | 23 + .../USB_DEVICE/App/usb_device_dinput.c | 23 + .../USB_DEVICE/App/usb_device_xinput.c | 23 + .../USB_DEVICE/App/usbd_desc.c | 394 + .../USB_DEVICE/App/usbd_desc.h | 143 + .../USB_DEVICE/App/usbd_desc_dfu.c | 137 + .../USB_DEVICE/App/usbd_desc_dinput.c | 156 + .../USB_DEVICE/App/usbd_desc_xinput.c | 159 + .../USB_DEVICE/App/usbd_dfu_bootloader.c | 369 + .../USB_DEVICE/App/usbd_dfu_bootloader.h | 22 + .../USB_DEVICE/App/usbd_dinput.c | 390 + .../USB_DEVICE/App/usbd_dinput.h | 28 + .../USB_DEVICE/App/usbd_xinput.c | 437 + .../USB_DEVICE/App/usbd_xinput.h | 44 + .../USB_DEVICE/Target/usbd_conf.c | 669 + .../USB_DEVICE/Target/usbd_conf.h | 177 + arcadestick_software/arcadestick.ioc | 228 + .../cmake/gcc-arm-none-eabi.cmake | 152 + arcadestick_software/cmake/starm-clang.cmake | 65 + .../cmake/stm32cubemx/CMakeLists.txt | 107 + arcadestick_software/startup_stm32f103xb.s | 364 + .../tools/package_firmware.ps1 | 47 + 146 files changed, 92135 insertions(+) create mode 100644 .gitignore create mode 100644 ArcadeStick_hardware/ArcadeStick.BomDoc create mode 100644 ArcadeStick_hardware/ArcadeStick.OutJob create mode 100644 ArcadeStick_hardware/ArcadeStick.PrjPcb create mode 100644 ArcadeStick_hardware/ArcadeStick.pdf create mode 100644 ArcadeStick_hardware/FabDocuments.zip create mode 100644 ArcadeStick_hardware/Job1.OutJob create mode 100644 ArcadeStick_hardware/LICENSE create mode 100644 ArcadeStick_hardware/PCB1.PcbDoc create mode 100644 ArcadeStick_hardware/Sheet1.SchDoc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 arcadestick_software/.clangd create mode 100644 arcadestick_software/.gitignore create mode 100644 arcadestick_software/.mxproject create mode 100644 arcadestick_software/.settings/bundles-lock.store.json create mode 100644 arcadestick_software/.settings/bundles.store.json create mode 100644 arcadestick_software/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs create mode 100644 arcadestick_software/.settings/ide.store.json create mode 100644 arcadestick_software/.settings/language.settings.xml create mode 100644 arcadestick_software/.settings/org.eclipse.core.resources.prefs create mode 100644 arcadestick_software/.settings/stm32cubeide.project.prefs create mode 100644 arcadestick_software/.vscode/c_cpp_properties.json create mode 100644 arcadestick_software/.vscode/extensions.json create mode 100644 arcadestick_software/.vscode/launch.json create mode 100644 arcadestick_software/.vscode/settings.json create mode 100644 arcadestick_software/.vscode/tasks.json create mode 100644 arcadestick_software/CMakeLists.txt create mode 100644 arcadestick_software/CMakePresets.json create mode 100644 arcadestick_software/Core/Inc/dinput_app.h create mode 100644 arcadestick_software/Core/Inc/main.h create mode 100644 arcadestick_software/Core/Inc/stm32f1xx_hal_conf.h create mode 100644 arcadestick_software/Core/Inc/stm32f1xx_it.h create mode 100644 arcadestick_software/Core/Inc/xinput_app.h create mode 100644 arcadestick_software/Core/Src/bootloader_main.c create mode 100644 arcadestick_software/Core/Src/dinput_app.c create mode 100644 arcadestick_software/Core/Src/main.c create mode 100644 arcadestick_software/Core/Src/stm32f1xx_hal_msp.c create mode 100644 arcadestick_software/Core/Src/stm32f1xx_it.c create mode 100644 arcadestick_software/Core/Src/syscalls.c create mode 100644 arcadestick_software/Core/Src/sysmem.c create mode 100644 arcadestick_software/Core/Src/system_stm32f1xx.c create mode 100644 arcadestick_software/Core/Src/xinput_app.c create mode 100644 arcadestick_software/DFU.md create mode 100644 arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h create mode 100644 arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h create mode 100644 arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h create mode 100644 arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/LICENSE.txt create mode 100644 arcadestick_software/Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/cmsis_version.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm0.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm1.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm23.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm3.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm33.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm4.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_cm7.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_sc000.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/core_sc300.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 arcadestick_software/Drivers/CMSIS/Include/tz_context.h create mode 100644 arcadestick_software/Drivers/CMSIS/LICENSE.txt create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd_ex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_bus.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_cortex.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_dma.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_exti.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_gpio.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_pwr.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_rcc.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_system.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_utils.h create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/LICENSE.txt create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c create mode 100644 arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c create mode 100644 arcadestick_software/LICENSE create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usbd_hid.h create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c create mode 100644 arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c create mode 100644 arcadestick_software/STM32F103xx_FLASH.ld create mode 100644 arcadestick_software/USB_DEVICE/App/usb_device.c create mode 100644 arcadestick_software/USB_DEVICE/App/usb_device.h create mode 100644 arcadestick_software/USB_DEVICE/App/usb_device_dfu.c create mode 100644 arcadestick_software/USB_DEVICE/App/usb_device_dinput.c create mode 100644 arcadestick_software/USB_DEVICE/App/usb_device_xinput.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_desc.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_desc.h create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_desc_dfu.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_desc_dinput.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_desc_xinput.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.h create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_dinput.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_dinput.h create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_xinput.c create mode 100644 arcadestick_software/USB_DEVICE/App/usbd_xinput.h create mode 100644 arcadestick_software/USB_DEVICE/Target/usbd_conf.c create mode 100644 arcadestick_software/USB_DEVICE/Target/usbd_conf.h create mode 100644 arcadestick_software/arcadestick.ioc create mode 100644 arcadestick_software/cmake/gcc-arm-none-eabi.cmake create mode 100644 arcadestick_software/cmake/starm-clang.cmake create mode 100644 arcadestick_software/cmake/stm32cubemx/CMakeLists.txt create mode 100644 arcadestick_software/startup_stm32f103xb.s create mode 100644 arcadestick_software/tools/package_firmware.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6bd4c68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Operating-system files +Thumbs.db +Desktop.ini +.DS_Store + +# Firmware build and IDE output +arcadestick_software/build/ +arcadestick_software/Debug/ +arcadestick_software/.metadata/ +arcadestick_software/.project +arcadestick_software/.cproject +arcadestick_software/debug.log +arcadestick_software/*.launch +arcadestick_software/mx.scratch/ + +# Altium-generated history, logs, previews, and output directories +ArcadeStick_hardware/History/ +ArcadeStick_hardware/Project Logs for ArcadeStick/ +ArcadeStick_hardware/Project Outputs for ArcadeStick/ +ArcadeStick_hardware/__Previews/ +ArcadeStick_hardware/*.PrjPcbStructure + +# Editor and temporary files +*.bak +*.tmp +*~ diff --git a/ArcadeStick_hardware/ArcadeStick.BomDoc b/ArcadeStick_hardware/ArcadeStick.BomDoc new file mode 100644 index 0000000..7fc9983 --- /dev/null +++ b/ArcadeStick_hardware/ArcadeStick.BomDoc @@ -0,0 +1,54 @@ +|RECORD=BOM|VERSION=6|FILENAME=D:\Workspace\Altium\ArcadeStick\ArcadeStick.BomDoc|KIND=ALTIUM_DESIGNER_LIVEBOM|DATE=21.03.2025|TIME=17:30:34|CURRENCY=USD|PRODUCTIONQUANTITY=1|PERUNITTARGETPRICE=0|PERUNITACTUALPRICE=0 +|RECORD=GeneralOptions|OPENEXPORTED=False|ADDTOPROJECT=False|FORCEFIT=False|NOTFITTED=False|TEMPLATEFILENAME=|BATCHMODE=0|SUPPLIERPRODQTY=0|SUPPLIERAUTOQTY=False|SUPPLIERUSECACHEDPRICING=False|SUPPLIERCURRENCY=|SOLUTIONSPERITEM=1|SUPPLIERSPERSOLUTION=1|DISPLAYTOTALROW=False|DISPLAYSUBTOTALSFORGROUPS=False|INCLUDEPCBPARAMETERS=False|INCLUDEDBPARAMETERS=False|INCLUDEVAULTPARAMETERS=False|INCLUDECLOUDPARAMETERS=False|INCLUDEDOCUMENTPARAMETERS=False|FILTEROUTRISKYSOLUTIONS=True|DESIGNATORGROUPING=No +|RECORD=SortOrderOptions|SORTORDER= +|RECORD=GroupOrderOptions|GROUPORDER= +|RECORD=VisibleOrderOptions|VISIBLEORDER=Line #=54!Comment=110!Description=186!Designator=299!Quantity=67!Manufacturer 1=102!Manufacturer Part Number 1=169!Manufacturer Lifecycle 1=147!Supplier 1=75!Supplier Part Number 1=142!Supplier Unit Price 1=127!Supplier Subtotal 1=122 +|RECORD=VisibleOrderOptions2|BASEVIEW=Line #=54!Comment=110!Description=186!Designator=299!Quantity=67!Manufacturer 1=102!Manufacturer Part Number 1=169!Manufacturer Lifecycle 1=147!Supplier 1=75!Supplier Part Number 1=142!Supplier Unit Price 1=127!Supplier Subtotal 1=122|FLATVIEW=Line #=54!Comment=110!Description=-1!Designator=80!Manufacturer 1=102!Manufacturer Part Number 1=169!Manufacturer Lifecycle 1=147!Supplier 1=75!Supplier Part Number 1=142!Supplier Unit Price 1=127!Supplier Subtotal 1=122|CONSOLIDATEDVIEW=Line #=54!Comment=110!Description=-1!Designator=-1!Quantity=67!Manufacturer 1=102!Manufacturer Part Number 1=169!Manufacturer Lifecycle 1=147!Supplier 1=75!Supplier Part Number 1=142!Supplier Unit Price 1=127!Supplier Subtotal 1=122 +|RECORD=CustomColumns|CUSTOMCOLUMNS= +|RECORD=ColumnsAliases|COLUMNSALIASES=Comment=Name +|RECORD=FilterOptions|FILTER= +|RECORD=CheckGroupCompParamsOptions|CHECKGROUPCOMPPARAMS=Comment=0,Description=0,Value=0,Footprint=1 +|RECORD=ManufacturerLinkOptions|MANUFACTURERLINKPARAMETERS= +|RECORD=FavoriteSuppliers|PARTSOURCES=|SUPPLIERS=|USESUPPLIERORDER=False +|RECORD=CheckOptions|CHECKLEVELS= +|RECORD=ExternalCheckOptions|CHECKLEVELS= +|RECORD=LineNumberingOptions|STARTVALUE=|INCREMENT= +|RECORD=Catalog|DBLINKFILEPATH= +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=ArcadeStick.SchLib\PTS645SL43-2LFS|DESIGNITEMID=PTS645SL43-2LFS|ITEMSOURCE=ArcadeStick.SchLib|STATUS=Unknown|DESCRIPTION=Switch Tactile N.O SPST Round Button PC Pins 0.05A 12VDC 100000Cycle 1.27N Thru-Hole Bulk|USERCOMMENTS=Button|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=Button,"Switch Tactile N.O SPST Round Button PC Pins 0.05A 12VDC 100000Cycle 1.27N Thru-Hole Bulk"|COMPONENTPARAMETERS="Category=Tactile Switches",Color=46Colour,Comment=Button,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/46429/1839862-46429333.pdf?src-supplier=Element14,ComponentLink1URL=https://datasheet.ciiva.com/46429/1839862-46429333.pdf?src-supplier=Element14,ComponentLink2Description=https://datasheet.ciiva.com/46429/1839862-46429334.pdf?src-supplier=Element14,ComponentLink2URL=https://datasheet.ciiva.com/46429/1839862-46429334.pdf?src-supplier=Element14,"Contact Current Rating=50mA","Contact Plating=159ConductorMaterial","Current Rating=50mA",Depth=7.9mm,"Description=Switch Tactile N.O SPST Round Button PC Pins 0.05A 12VDC 100000Cycle 1.27N Thru-Hole Bulk",Footprint=PTS645SL43-2LFS,"Ibis Model=","Lead Free=5697LeadFree",Length=6mm,"Library Name=ArcadeStick.SchLib","Library Reference=PTS645SL43-2LFS","Manufacturer=ITT C&K","Manufacturer Part Number=PTS645SL43-2LFS","Max Current Rating=50mA","Number of Poles=1NUMBER","Number of Positions=1NUMBER",Orientation=5491OrientationType,Packaging=14Packaging,PCB3D=,"Pin Info=","Pricing=1=0.24, 10=0.206, 25=0.1928, 100=0.1731, 250=0.16052, 500=0.15146, 2000=0.13509, 4000=0.12786, 6000=0.12396 (USD)",RoHS=Yes,"Signal Integrity=",Simulation=,Stock=19492,Supplier=Digikey,"Supplier Part Number=CKN9098-ND",Value=Button,"Voltage Rating (DC)=12V"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\PTS645SL43-2LFS|DESIGNITEMID=PTS645SL43-2LFS|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Switch Tactile N.O SPST Round Button PC Pins 0.05A 12VDC 100000Cycle 1.27N Thru-Hole Bulk|USERCOMMENTS=Button|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=Button,"Switch Tactile N.O SPST Round Button PC Pins 0.05A 12VDC 100000Cycle 1.27N Thru-Hole Bulk"|COMPONENTPARAMETERS="Category=Tactile Switches",Color=46Colour,Comment=Button,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/46429/1839862-46429333.pdf?src-supplier=Element14,ComponentLink1URL=https://datasheet.ciiva.com/46429/1839862-46429333.pdf?src-supplier=Element14,ComponentLink2Description=https://datasheet.ciiva.com/46429/1839862-46429334.pdf?src-supplier=Element14,ComponentLink2URL=https://datasheet.ciiva.com/46429/1839862-46429334.pdf?src-supplier=Element14,"Contact Current Rating=50mA","Contact Plating=159ConductorMaterial","Current Rating=50mA",Depth=7.9mm,"Description=Switch Tactile N.O SPST Round Button PC Pins 0.05A 12VDC 100000Cycle 1.27N Thru-Hole Bulk",Footprint=PTS645SL43-2LFS,"Ibis Model=","Lead Free=5697LeadFree",Length=6mm,"Library Name=GeneralLib.IntLib","Library Reference=PTS645SL43-2LFS","Manufacturer=ITT C&K","Manufacturer Part Number=PTS645SL43-2LFS","Max Current Rating=50mA","Number of Poles=1NUMBER","Number of Positions=1NUMBER",Orientation=5491OrientationType,Packaging=14Packaging,PCB3D=,"Pin Info=","Pricing=1=0.24, 10=0.206, 25=0.1928, 100=0.1731, 250=0.16052, 500=0.15146, 2000=0.13509, 4000=0.12786, 6000=0.12396 (USD)",RoHS=Yes,"Signal Integrity=",Simulation=,Stock=19492,Supplier=Digikey,"Supplier Part Number=CKN9098-ND",Value=Button,"Voltage Rating (DC)=12V"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\T491C106K025AT|DESIGNITEMID=T491C106K025AT|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=10 µF Molded Tantalum Capacitors 25 V 2312 (6032 Metric) 1.5Ohm|USERCOMMENTS=10uF/25V|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,"10 µF Molded Tantalum Capacitors 25 V 2312 (6032 Metric) 1.5Ohm",10uF/25V|COMPONENTPARAMETERS="Availability=In Stock",Check_prices=https://www.snapeda.com/parts/T491C106K025AT/KEMET/view-part/?ref=eda,Comment=10uF/25V,"Component Kind=Standard","Description=10 µF Molded Tantalum Capacitors 25 V 2312 (6032 Metric) 1.5Ohm",Footprint=CAPPC6032X280N,"Ibis Model=","Library Name=GeneralLib.IntLib","Library Reference=T491C106K025AT",MF=KEMET,MP=T491C106K025AT,"Package=SMD-2 KEMET",PCB3D=,"Pin Info=",Price=None,Purchase-URL=https://pricing.snapeda.com/search/part/T491C106K025AT/?ref=eda,"Signal Integrity=",Simulation=,SnapEDA_Link=https://www.snapeda.com/parts/T491C106K025AT/KEMET/view-part/?ref=snap,Value=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\T491A106M016AT|DESIGNITEMID=T491A106M016AT|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=10µF Molded Tantalum Capacitors 16V 1206 _3216 Metric_ 7Ohm|USERCOMMENTS=10uF/16V|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,"10µF Molded Tantalum Capacitors 16V 1206 _3216 Metric_ 7Ohm",10uF/16V|COMPONENTPARAMETERS=Availability=Unavailable,Comment=10uF/16V,"Component Kind=Standard","Description=10µF Molded Tantalum Capacitors 16V 1206 _3216 Metric_ 7Ohm",Footprint=RESC3216X125N,"Ibis Model=","Library Name=GeneralLib.IntLib","Library Reference=T491A106M016AT",MF=KEMET,MP=T491A106M016AT,"Package=1206 KEMET",PCB3D=,"Pin Info=",Price=None,"Signal Integrity=",Simulation=,SnapEDA_Link=https://www.snapeda.com/parts/T491A106M016AT/KEMET/view-part/524712/?ref=snap,Value=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\CC1206KKX7R0BB104|DESIGNITEMID=CC1206KKX7R0BB104|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Multilayer Ceramic Capacitor, 0.1 uF, 100 V, � 10%, X7R, 1206 [3216 Metric]|USERCOMMENTS=100nF|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=100nF,"Multilayer Ceramic Capacitor, 0.1 uF, 100 V, � 10%, X7R, 1206 [3216 Metric]"|COMPONENTPARAMETERS="Case Code (Imperial)=1206","Case Code (Metric)=3216",Case/Package=1206,"Category=Ceramic Capacitors",Comment=100nF,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/7978/1447671-7978227.pdf?src-supplier=Element14,ComponentLink1URL=https://datasheet.ciiva.com/7978/1447671-7978227.pdf?src-supplier=Element14,ComponentLink2Description=https://datasheet.ciiva.com/180/mlccorderingcode-180145.pdf?src-supplier=Digikey,ComponentLink2URL=https://datasheet.ciiva.com/180/mlccorderingcode-180145.pdf?src-supplier=Digikey,ComponentLink3Description=https://datasheet.ciiva.com/16981/upy-np0x7r-mv-100-to-630v-9-16981180.pdf?src-supplier=Future+Electronics,ComponentLink3URL=https://datasheet.ciiva.com/16981/upy-np0x7r-mv-100-to-630v-9-16981180.pdf?src-supplier=Future+Electronics,ComponentLink4Description=https://datasheet.ciiva.com/46391/1919308-46391993.pdf?src-supplier=Element14,ComponentLink4URL=https://datasheet.ciiva.com/46391/1919308-46391993.pdf?src-supplier=Element14,ComponentLink5Description=https://datasheet.ciiva.com/180/mlccorderingcode-180144.pdf?src-supplier=Digikey,ComponentLink5URL=https://datasheet.ciiva.com/180/mlccorderingcode-180144.pdf?src-supplier=Digikey,ComponentLink6Description=https://datasheet.ciiva.com/180/mlccorderingcode-180146.pdf?src-supplier=Digikey,ComponentLink6URL=https://datasheet.ciiva.com/180/mlccorderingcode-180146.pdf?src-supplier=Digikey,ComponentLink7Description=https://datasheet.ciiva.com/5425/upy-gp-np0-16v-to-50v-8-5425573.pdf?src-supplier=Mouser,ComponentLink7URL=https://datasheet.ciiva.com/5425/upy-gp-np0-16v-to-50v-8-5425573.pdf?src-supplier=Mouser,ComponentLink8Description=https://datasheet.ciiva.com/26829/getdatasheetpartid-403790-26829655.pdf?src-supplier=Verical,ComponentLink8URL=https://datasheet.ciiva.com/26829/getdatasheetpartid-403790-26829655.pdf?src-supplier=Verical,Depth=1.6mm,"Description=Multilayer Ceramic Capacitor, 0.1 uF, 100 V, � 10%, X7R, 1206 [3216 Metric]",Dielectric=X7R,"Dielectric Material=Ceramic",Footprint=1206,Height=1.25mm,"Ibis Model=","Lead Free=Lead Free",Length=3.2mm,"Library Name=GeneralLib.IntLib","Library Reference=CC1206KKX7R0BB104",Manufacturer=Yageo,"Manufacturer Part Number=CC1206KKX7R0BB104",Material=4241ConductorMaterial,"Max Operating Temperature=125C","Min Operating Temperature=-55C","Mounting Technology=Surface Mount","Package Quantity=1","Packaging=Tape and Reel",PCB3D=,"Pin Info=",Pins=2,"Pricing=1=0.14, 10=0.078, 100=0.0474, 1000=0.03178 (USD)","Radiation Hardening=No","Reach SVHC Compliant=No",RoHS=Yes,"RoHS Compliant=Yes",Series=CC,"Signal Integrity=",Simulation=,Stock=29143,Supplier=Digikey,"Supplier Part Number=311-1488-1-ND",Termination=SMD/SMT,Thickness=0.057inch,Tolerance=10%,Value=100nF,Voltage=63V,"Voltage Rating=100V","Voltage Rating (AC)=100V","Voltage Rating (DC)=100V",Width=0.063inch|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\CL31B475KBHNNNE|DESIGNITEMID=CL31B475KBHNNNE|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Multilayer Ceramic Capacitor, 4.7 uF, 50 V, � 10%, X7R, 1206 [3216 Metric]|USERCOMMENTS=4.7uF|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=4.7uF,"Multilayer Ceramic Capacitor, 4.7 uF, 50 V, � 10%, X7R, 1206 [3216 Metric]"|COMPONENTPARAMETERS="Case Code (Imperial)=1206","Case Code (Metric)=3216",Case/Package=1206,"Category=Ceramic Capacitors",Comment=4.7uF,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/25793/cl31b475kbhnnne-25793922.pdf?src-supplier=Digikey,ComponentLink1URL=https://datasheet.ciiva.com/25793/cl31b475kbhnnne-25793922.pdf?src-supplier=Digikey,ComponentLink2Description=https://datasheet.ciiva.com/16449/cl31b475kbhnnne-16449503.pdf?src-supplier=Future+Electronics,ComponentLink2URL=https://datasheet.ciiva.com/16449/cl31b475kbhnnne-16449503.pdf?src-supplier=Future+Electronics,ComponentLink3Description=https://datasheet.ciiva.com/26310/mlcc-catalogdownload2013-eng-26310095.pdf?src-supplier=Distrelec,ComponentLink3URL=https://datasheet.ciiva.com/26310/mlcc-catalogdownload2013-eng-26310095.pdf?src-supplier=Distrelec,Construction=Flat,Depth=1.6mm,"Description=Multilayer Ceramic Capacitor, 4.7 uF, 50 V, � 10%, X7R, 1206 [3216 Metric]",Dielectric=X7R,Footprint=1206,Height=1.6mm,"Ibis Model=",Length=3.2mm,"Library Name=GeneralLib.IntLib","Library Reference=CL31B475KBHNNNE",Manufacturer=Samsung,"Manufacturer Part Number=CL31B475KBHNNNE",Material=Ceramic,"Max Operating Temperature=125C","Min Operating Temperature=-55C","Mounting Technology=Surface Mount","Package Quantity=1","Packaging=Tape and Reel",PCB3D=,"Pin Info=","Pricing=1=0.29, 10=0.169, 100=0.1085, 1000=0.07738 (USD)","Radiation Hardening=No",RoHS=Yes,"RoHS Compliant=Yes",Series=CL,"Signal Integrity=",Simulation=,Stock=146065,Supplier=Digikey,"Supplier Part Number=1276-2789-1-ND",Thickness=0.071inch,Tolerance=10%,Value=4.7uF,Voltage=50V,"Voltage Rating=50V","Voltage Rating (DC)=50V",Width=0.063inch|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\CC1206KKX7RCBB103|DESIGNITEMID=CC1206KKX7RCBB103|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Surface Mount Ceramic Multilayer Capacitor 0.01uF 10% X7R 1kV 1206 Blister T/R|USERCOMMENTS=10nF|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=10nF,"Surface Mount Ceramic Multilayer Capacitor 0.01uF 10% X7R 1kV 1206 Blister T/R"|COMPONENTPARAMETERS="Category=Ceramic Capacitors",Comment=10nF,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/11788/0900766b80d8503a-11788379.pdf?src-supplier=Rs,ComponentLink1URL=https://datasheet.ciiva.com/11788/0900766b80d8503a-11788379.pdf?src-supplier=Rs,ComponentLink2Description=https://datasheet.ciiva.com/26863/getdatasheetpartid-403810-26863103.pdf?src-supplier=Verical,ComponentLink2URL=https://datasheet.ciiva.com/26863/getdatasheetpartid-403810-26863103.pdf?src-supplier=Verical,ComponentLink3Description=https://datasheet.ciiva.com/15381/upy-gp-np0-16v-to-50v-8-15381925.pdf?src-supplier=Mouser,ComponentLink3URL=https://datasheet.ciiva.com/15381/upy-gp-np0-16v-to-50v-8-15381925.pdf?src-supplier=Mouser,"Description=Surface Mount Ceramic Multilayer Capacitor 0.01uF 10% X7R 1kV 1206 Blister T/R","Dielectric Material=4241ConductorMaterial",Footprint=1206,"Ibis Model=","Lead Free=5697LeadFree","Library Name=GeneralLib.IntLib","Library Reference=CC1206KKX7RCBB103",Manufacturer=Yageo,"Manufacturer Part Number=CC1206KKX7RCBB103",PCB3D=,"Pin Info=","Pricing=1=0.54, 10=0.329, 100=0.2222, 1000=0.16703 (USD)",RoHS=Yes,"Signal Integrity=",Simulation=,Stock=60209,Supplier=Digikey,"Supplier Part Number=311-1500-1-ND",Value=10nF,"Voltage Rating (AC)=1kV"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\CC1206KKX7R7BB105|DESIGNITEMID=CC1206KKX7R7BB105|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Multilayer Ceramic Capacitor, 1 uF, 16 V, � 10%, X7R, 1206 [3216 Metric]|USERCOMMENTS=1uF|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=1uF,"Multilayer Ceramic Capacitor, 1 uF, 16 V, � 10%, X7R, 1206 [3216 Metric]"|COMPONENTPARAMETERS="Category=Ceramic Capacitors",Comment=1uF,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/13173/upy-gphc-x7r-6-3v-to-50v-8-12304-13173863.pdf?src-supplier=Mouser,ComponentLink1URL=https://datasheet.ciiva.com/13173/upy-gphc-x7r-6-3v-to-50v-8-12304-13173863.pdf?src-supplier=Mouser,ComponentLink2Description=https://datasheet.ciiva.com/7978/1489800-7978229.pdf?src-supplier=Element14,ComponentLink2URL=https://datasheet.ciiva.com/7978/1489800-7978229.pdf?src-supplier=Element14,ComponentLink3Description=https://datasheet.ciiva.com/26829/getdatasheetpartid-403794-26829659.pdf?src-supplier=Verical,ComponentLink3URL=https://datasheet.ciiva.com/26829/getdatasheetpartid-403794-26829659.pdf?src-supplier=Verical,ComponentLink4Description=https://datasheet.ciiva.com/178/mlccorderingcode-178166.pdf?src-supplier=Digikey,ComponentLink4URL=https://datasheet.ciiva.com/178/mlccorderingcode-178166.pdf?src-supplier=Digikey,ComponentLink5Description=https://datasheet.ciiva.com/178/mlccorderingcode-178167.pdf?src-supplier=Digikey,ComponentLink5URL=https://datasheet.ciiva.com/178/mlccorderingcode-178167.pdf?src-supplier=Digikey,ComponentLink6Description=https://datasheet.ciiva.com/178/mlccorderingcode-178168.pdf?src-supplier=Digikey,ComponentLink6URL=https://datasheet.ciiva.com/178/mlccorderingcode-178168.pdf?src-supplier=Digikey,ComponentLink7Description=https://datasheet.ciiva.com/11464/upy-gphc-x7r-6-3v-to-50v-8-11464763.pdf?src-supplier=Avnet,ComponentLink7URL=https://datasheet.ciiva.com/11464/upy-gphc-x7r-6-3v-to-50v-8-11464763.pdf?src-supplier=Avnet,"Description=Multilayer Ceramic Capacitor, 1 uF, 16 V, � 10%, X7R, 1206 [3216 Metric]","Dielectric Material=4241ConductorMaterial",Footprint=1206,"Halogen Free=5694HalogenFree","Ibis Model=","Lead Free=5697LeadFree","Library Name=GeneralLib.IntLib","Library Reference=CC1206KKX7R7BB105",Manufacturer=Yageo,"Manufacturer Part Number=CC1206KKX7R7BB105",Material=4241ConductorMaterial,PCB3D=,"Pin Info=","Pricing=1=0.22, 10=0.128, 100=0.0804, 1000=0.05608 (USD)",RoHS=Yes,"Signal Integrity=",Simulation=,Stock=193160,Supplier=Digikey,"Supplier Part Number=311-1181-1-ND",Value=1uF,"Voltage Rating (AC)=16V"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\CC0805JRNPO9BN180|DESIGNITEMID=CC0805JRNPO9BN180|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Multilayer Ceramic Capacitor, 18 pF, 50 V, � 5%, C0G (NP0), 0805 [2012 Metric]|USERCOMMENTS=18pF|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=18pF,"Multilayer Ceramic Capacitor, 18 pF, 50 V, � 5%, C0G (NP0), 0805 [2012 Metric]"|COMPONENTPARAMETERS="Category=Ceramic Capacitors",Comment=18pF,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/26862/getdatasheetpartid-403658-26862933.pdf?src-supplier=Verical,ComponentLink1URL=https://datasheet.ciiva.com/26862/getdatasheetpartid-403658-26862933.pdf?src-supplier=Verical,ComponentLink2Description=https://datasheet.ciiva.com/144/mlccorderingcode-144754.pdf?src-supplier=Digikey,ComponentLink2URL=https://datasheet.ciiva.com/144/mlccorderingcode-144754.pdf?src-supplier=Digikey,ComponentLink3Description=https://datasheet.ciiva.com/144/mlccorderingcode-144755.pdf?src-supplier=Digikey,ComponentLink3URL=https://datasheet.ciiva.com/144/mlccorderingcode-144755.pdf?src-supplier=Digikey,ComponentLink4Description=https://datasheet.ciiva.com/144/mlccorderingcode-144756.pdf?src-supplier=Digikey,ComponentLink4URL=https://datasheet.ciiva.com/144/mlccorderingcode-144756.pdf?src-supplier=Digikey,ComponentLink5Description=https://datasheet.ciiva.com/11586/upy-gp-np0-16v-to-50v-8-11586203.pdf?src-supplier=Avnet,ComponentLink5URL=https://datasheet.ciiva.com/11586/upy-gp-np0-16v-to-50v-8-11586203.pdf?src-supplier=Avnet,ComponentLink6Description=https://datasheet.ciiva.com/29241/445366-da-01-en-kerko-chip-0805-np0-18pf-5proz50v-g-29241990.pdf?src-supplier=Conrad,ComponentLink6URL=https://datasheet.ciiva.com/29241/445366-da-01-en-kerko-chip-0805-np0-18pf-5proz50v-g-29241990.pdf?src-supplier=Conrad,"Description=Multilayer Ceramic Capacitor, 18 pF, 50 V, � 5%, C0G (NP0), 0805 [2012 Metric]",Footprint=0805,"Ibis Model=","Lead Free=5697LeadFree","Library Name=GeneralLib.IntLib","Library Reference=CC0805JRNPO9BN180",Manufacturer=Yageo,"Manufacturer Part Number=CC0805JRNPO9BN180",PCB3D=,"Pin Info=","Pricing=1=0.1, 10=0.048, 100=0.0284, 1000=0.01828 (USD)",RoHS=Yes,"Signal Integrity=",Simulation=,Stock=178466,Supplier=Digikey,"Supplier Part Number=311-1102-1-ND",Value=18pF|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\MINISMDC050F-2|DESIGNITEMID=MINISMDC050F-2|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Polymeric PTC Resettable Fuse 24V 500 mA Ih Surface Mount 1812 (4532 Metric), Concave|USERCOMMENTS=FUSE 500mA 24V|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,"FUSE 500mA 24V","Polymeric PTC Resettable Fuse 24V 500 mA Ih Surface Mount 1812 (4532 Metric), Concave"|COMPONENTPARAMETERS="Availability=In Stock",Check_prices=https://www.snapeda.com/parts/MINISMDC050F-2/Littelfuse/view-part/?ref=eda,"Comment=FUSE 500mA 24V","Component Kind=Standard","Description=Polymeric PTC Resettable Fuse 24V 500 mA Ih Surface Mount 1812 (4532 Metric), Concave",Footprint=FUSSC324X455X62L,"Ibis Model=","Library Name=GeneralLib.IntLib","Library Reference=MINISMDC050F-2","MF=Littelfuse Inc.",MP=MINISMDC050F-2,"Package=1812 Littelfuse Inc.",PCB3D=,"Pin Info=",Price=None,Purchase-URL=https://pricing.snapeda.com/search/part/MINISMDC050F-2/?ref=eda,"Signal Integrity=",Simulation=,SnapEDA_Link=https://www.snapeda.com/parts/MINISMDC050F-2/Littelfuse/view-part/?ref=snap,Value=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\Circuit Breaker|DESIGNITEMID=Circuit Breaker|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=|USERCOMMENTS=Jumper|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,Jumper|COMPONENTPARAMETERS=Comment=Jumper,"Component Kind=Standard",Description=,Footprint=0603,"Ibis Model=","Library Name=GeneralLib.IntLib","Library Reference=Circuit Breaker",PCB3D=,"Pin Info=","Signal Integrity=",Simulation=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\2x10 Header Pin|DESIGNITEMID=2x10 Header Pin|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=Pitch : 2.547mm|USERCOMMENTS=Header2x10|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=Header2x10,"Pitch : 2.547mm"|COMPONENTPARAMETERS=Comment=Header2x10,"Component Kind=Standard","Description=Pitch : 2.547mm","Footprint=2x10 Header Pin 2.547mm","Ibis Model=","Library Name=GeneralLib.IntLib","Library Reference=2x10 Header Pin",PCB3D=,"Pin Info=","Signal Integrity=",Simulation=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\RC0805JR-0710KL|DESIGNITEMID=RC0805JR-0710KL|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=SMD Chip Resistor, 10 kOhm, � 5%, 125 mW, 0805 [2012 Metric], Thick Film, General Purpose|USERCOMMENTS=10kR|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=10kR,"SMD Chip Resistor, 10 kOhm, � 5%, 125 mW, 0805 [2012 Metric], Thick Film, General Purpose"|COMPONENTPARAMETERS="Case Code (Imperial)=0805","Case Code (Metric)=2012",Case/Package=0805,"Category=Chip SMD Resistors",Comment=10kR,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/7983/444164-7983765.pdf?src-supplier=Element14,ComponentLink1URL=https://datasheet.ciiva.com/7983/444164-7983765.pdf?src-supplier=Element14,ComponentLink2Description=https://datasheet.ciiva.com/7941/444164-7941870.pdf?src-supplier=Element14,ComponentLink2URL=https://datasheet.ciiva.com/7941/444164-7941870.pdf?src-supplier=Element14,ComponentLink3Description=https://datasheet.ciiva.com/7941/444164-7941871.pdf?src-supplier=Element14,ComponentLink3URL=https://datasheet.ciiva.com/7941/444164-7941871.pdf?src-supplier=Element14,Construction=Rectangular,"Contact Plating=Tin,Matte",Depth=1.25mm,"Description=SMD Chip Resistor, 10 kOhm, � 5%, 125 mW, 0805 [2012 Metric], Thick Film, General Purpose","Features=Moisture Resistant",Footprint=0805,Height=0.5mm,"Ibis Model=","Lead Free=5697LeadFree",Length=2mm,"Library Name=GeneralLib.IntLib","Library Reference=RC0805JR-0710KL",Manufacturer=Yageo,"Manufacturer Part Number=RC0805JR-0710KL","Max Operating Temperature=155C","Max Power Dissipation=125mW","Military Standard=Not","Min Operating Temperature=-55C","Number of Terminations=2","Packaging=Tape and Reel",PCB3D=,"Pin Info=","Power Rating=125mW","Pricing=1=0.1, 10=0.012, 50=0.012, 100=0.009, 1000=0.008, 10000=0.003 (USD)","Radiation Hardening=No","Reach SVHC Compliant=Unknown","Resistance Tolerance=5%","Resistor Type=Thick Film",RoHS=Yes,"RoHS Compliant=Yes",Series=RC,"Signal Integrity=",Simulation=,Stock=346566,Supplier=Mouser,"Supplier Part Number=603-RC0805JR-0710KL","Temperature Coefficient=100ppm/C",Termination=SMD/SMT,Tolerance=5%,Value=10kR,"Voltage Rating=150V",Width=1.25mm|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\JS202011SCQN|DESIGNITEMID=JS202011SCQN|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=C&k Components JS202011SCQN / Switch Slide DPDT 6VDC 0.3A SMT|USERCOMMENTS=Switch|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH="C&k Components JS202011SCQN / Switch Slide DPDT 6VDC 0.3A SMT",Switch|COMPONENTPARAMETERS="Actuator Color=Black","Actuator Length=2mm","Actuator Material=Nylon,Polyamide,PA46","Actuator Type=Standard","Category=Slide Switches",Comment=Switch,"Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/2889/js-29aug13-2889127.pdf?src-supplier=Digikey,ComponentLink1URL=https://datasheet.ciiva.com/2889/js-29aug13-2889127.pdf?src-supplier=Digikey,ComponentLink2Description=https://datasheet.ciiva.com/23829/1707718-23829488.pdf?src-supplier=Newark,ComponentLink2URL=https://datasheet.ciiva.com/23829/1707718-23829488.pdf?src-supplier=Newark,ComponentLink3Description=https://datasheet.ciiva.com/22630/1707718-22630697.pdf?src-supplier=Element14,ComponentLink3URL=https://datasheet.ciiva.com/22630/1707718-22630697.pdf?src-supplier=Element14,ComponentLink4Description=https://datasheet.ciiva.com/2889/js-15sept15-2889128.pdf?src-supplier=Digikey,ComponentLink4URL=https://datasheet.ciiva.com/2889/js-15sept15-2889128.pdf?src-supplier=Digikey,ComponentLink5Description=https://datasheet.ciiva.com/2889/js-15sept15-2889129.pdf?src-supplier=Digikey,ComponentLink5URL=https://datasheet.ciiva.com/2889/js-15sept15-2889129.pdf?src-supplier=Digikey,ComponentLink6Description=https://datasheet.ciiva.com/8625/js-9dec14-8625470.pdf?src-supplier=Avnet,ComponentLink6URL=https://datasheet.ciiva.com/8625/js-9dec14-8625470.pdf?src-supplier=Avnet,"Contact Current Rating=300mA","Contact Material=Copper Alloy","Contact Plating=Silver","Contact Resistance=70mR",Depth=7.5mm,"Description=C&k Components JS202011SCQN / Switch Slide DPDT 6VDC 0.3A SMT","Electrical Life=5000Cycles","Flammability Rating=UL94 V-2",Footprint=JS202011SCQN,"Housing Material=Nylon","Ibis Model=","Lead Free=5697LeadFree",Length=9mm,"Library Name=GeneralLib.IntLib","Library Reference=JS202011SCQN","Manufacturer=ITT C&K","Manufacturer Part Number=JS202011SCQN","Max Current Rating=300mA","Max Operating Temperature=85C","Max Voltage Rating (DC)=6V","Min Operating Temperature=-40C","Mounting Technology=Surface Mount","Number of Positions=2NUMBER",Orientation=Vertical,"Package Quantity=1000","Packaging=Tape and Reel",PCB3D=,"Pin Info=",Pins=6NUMBER,"Pricing=1=0.74, 10=0.613, 50=0.613, 100=0.532, 1000=0.385, 10000=0.366 (USD)","Reach SVHC Compliant=No",RoHS=Yes,"RoHS Compliant=Yes",Series=JS,"Signal Integrity=",Simulation=,Supplier=Mouser,"Supplier Part Number=611-JS202011SCQN","Switch Function=On-On","Switch Travel=2mm","Termination=Gull Wing","Throw Configuration=DPDT","Voltage Rating (DC)=6V"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=ArcadeStick.SchLib\USBLC6-2SC6|DESIGNITEMID=USBLC6-2SC6|ITEMSOURCE=ArcadeStick.SchLib|STATUS=Unknown|DESCRIPTION=ESD Suppressor Diode Array Dual Uni-Dir 15kV Air Gap/15kV Contact Disc 6-Pin SOT-23 T/R|USERCOMMENTS=USB Filter|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=3.5pF,"ESD Suppressor Diode Array Dual Uni-Dir 15kV Air Gap/15kV Contact Disc 6-Pin SOT-23 T/R","USB Filter"|COMPONENTPARAMETERS="Breakdown Voltage=6V",Case/Package=SOT-23,"Category=TVS Diodes","Clamping Voltage=17V","Clamping Voltage-Max=17V","Comment=USB Filter","Component Kind=Standard",ComponentLink1Description=https://datasheet.ciiva.com/1268/1690354-1268384.pdf?src-supplier=Element14,ComponentLink1URL=https://datasheet.ciiva.com/1268/1690354-1268384.pdf?src-supplier=Element14,ComponentLink2Description=https://datasheet.ciiva.com/4508/cd00050750-113117-4508433.pdf?src-supplier=Mouser,ComponentLink2URL=https://datasheet.ciiva.com/4508/cd00050750-113117-4508433.pdf?src-supplier=Mouser,ComponentLink3Description=https://datasheet.ciiva.com/15143/getdatasheetpartid-148465-15143789.pdf?src-supplier=Verical,ComponentLink3URL=https://datasheet.ciiva.com/15143/getdatasheetpartid-148465-15143789.pdf?src-supplier=Verical,ComponentLink4Description=https://datasheet.ciiva.com/16200/cd00050750-16200026.pdf?src-supplier=Future+Electronics,ComponentLink4URL=https://datasheet.ciiva.com/16200/cd00050750-16200026.pdf?src-supplier=Future+Electronics,ComponentLink5Description=https://datasheet.ciiva.com/41444/001184109-da-01-en-ic-esd-protecti-usblc6-2sc6-sot-23-6-stm-41444156.pdf?src-supplier=Conrad,ComponentLink5URL=https://datasheet.ciiva.com/41444/001184109-da-01-en-ic-esd-protecti-usblc6-2sc6-sot-23-6-stm-41444156.pdf?src-supplier=Conrad,"Data Rate=480Mbps",Depth=1.75mm,"Description=ESD Suppressor Diode Array Dual Uni-Dir 15kV Air Gap/15kV Contact Disc 6-Pin SOT-23 T/R","Direction=Unidirectional,Bidirectional","ESD Protection=Yes",Footprint=USBLC6-2SC6,Height=1.3mm,"Ibis Model=","Lead Free=Lead Free","Leakage Current=150nA",Length=3.05mm,"Library Name=ArcadeStick.SchLib","Library Reference=USBLC6-2SC6",Manufacturer=STMicroelectronics,"Manufacturer Part Number=USBLC6-2SC6","Max Breakdown Voltage=6V","Max Operating Temperature=125C","Max Repetitive Reverse Voltage (Vrrm)=5.25V","Max Reverse Leakage Current=150nA","Min Breakdown Voltage=6V","Min Operating Temperature=-40C","Mounting Technology=Surface Mount","Number of Bidirectional Channels=2","Number of Channels=2","Number of Elements=1","Operating Supply Voltage=1.1V","Package Quantity=3000","Packaging=Tape and Reel",PCB3D=,"Peak Pulse Current=5A","Pin Info=",Pins=6,"Polarity=Unidirectional,Bidirectional","Power Line Protection=Yes","Pricing=1=0.36, 10=0.243, 50=0.243, 100=0.163, 1000=0.114, 10000=0.077 (USD)","Radiation Hardening=No","Reach SVHC Compliant=No","Reverse Breakdown Voltage=6V","Reverse Standoff Voltage=5.25V",RoHS=Yes,"RoHS Compliant=Yes",Series=USB,"Signal Integrity=",Simulation=,Stock=115948,Supplier=Mouser,"Supplier Part Number=511-USBLC6-2SC6",Termination=SMD/SMT,"Test Current=1mA",Value=3.5pF,Width=1.75mm,"Working Voltage=5V"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=ArcadeStick.SchLib\STM32F103RCT6|DESIGNITEMID=STM32F103RCT6|ITEMSOURCE=ArcadeStick.SchLib|STATUS=Unknown|DESCRIPTION=ARM® Cortex®-M3 STM32F1 Microcontroller IC 32-Bit 72MHz 256KB (256K x 8) FLASH 64-LQFP (10x10)|USERCOMMENTS=STM32F103RCT6|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,"ARM® Cortex®-M3 STM32F1 Microcontroller IC 32-Bit 72MHz 256KB (256K x 8) FLASH 64-LQFP (10x10)",STM32F103RCT6|COMPONENTPARAMETERS="Availability=In Stock",Check_prices=https://www.snapeda.com/parts/STM32F103RCT6/STMicroelectronics/view-part/?ref=eda,Comment=STM32F103RCT6,"Component Kind=Standard","Description=ARM® Cortex®-M3 STM32F1 Microcontroller IC 32-Bit 72MHz 256KB (256K x 8) FLASH 64-LQFP (10x10)",Footprint=QFP50P1200X1200X160-64N,"Ibis Model=","Library Name=ArcadeStick.SchLib","Library Reference=STM32F103RCT6",MF=STMicroelectronics,MP=STM32F103RCT6,"Package=LQFP-64 STMicroelectronics",PCB3D=,"Pin Info=",Price=None,Purchase-URL=https://pricing.snapeda.com/search/part/STM32F103RCT6/?ref=eda,"Signal Integrity=",Simulation=,SnapEDA_Link=https://www.snapeda.com/parts/STM32F103RCT6/STMicroelectronics/view-part/?ref=snap,Value=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\629105136821|DESIGNITEMID=629105136821|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=WR-COM Micro USB 2.0 SMT Type B Horizontal 5 Contacts|USERCOMMENTS=629105136821|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=629105136821,"WR-COM Micro USB 2.0 SMT Type B Horizontal 5 Contacts"|COMPONENTPARAMETERS="Application=Micro USB 2.0","Category=Input/Output Connectors",Comment=629105136821,"Component Kind=Standard","ComponentLink1Description=Website Link",ComponentLink1URL=https://www.we-online.com/redexpert/article/629105136821?ad,"ComponentLink2Description=Datasheet Link",ComponentLink2URL=https://www.we-online.com/redexpert/spec/629105136821?ad,"Description=WR-COM Micro USB 2.0 SMT Type B Horizontal 5 Contacts",Footprint=629105136821,Gender=Receptacle,"Ibis Model=","Interface Type=Type B","Library Name=GeneralLib.IntLib","Library Reference=629105136821","Manufacturer=Wurth Elektronik","Manufacturer Part Number=629105136821","Match Code=WR-USB","Max Operating Temperature=105C","Min Operating Temperature=-40C","Mount=Surface Mount","Number of Pins=5","Number of Ports=1",Orientation=Horizontal,"Packaging=Tape and Reel",PCB3D=,"Pin Info=","Rated Current=1A","Signal Integrity=",Simulation=,"Working Voltage=30V (AC)"|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=ArcadeStick.SchLib\LM1117MPX-3.3|DESIGNITEMID=LM1117MPX-3.3|ITEMSOURCE=ArcadeStick.SchLib|STATUS=Unknown|DESCRIPTION=800-mA 15-V linear voltage regulator|USERCOMMENTS=LM1117|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,"800-mA 15-V linear voltage regulator",LM1117|COMPONENTPARAMETERS="Availability=In Stock",Check_prices=https://www.snapeda.com/parts/LM1117MPX-3.3/Texas+Instruments/view-part/?ref=eda,Comment=LM1117,"Component Kind=Standard","Description=800-mA 15-V linear voltage regulator",Footprint=VREG_LM1117MPX-3.3,"Ibis Model=","Library Name=ArcadeStick.SchLib","Library Reference=LM1117MPX-3.3","MF=Texas Instruments",MP=LM1117MPX-3.3,"Package=SOT-223-4 Texas Instruments",PCB3D=,"Pin Info=",Price=None,Purchase-URL=https://pricing.snapeda.com/search/part/LM1117MPX-3.3/?ref=eda,"Signal Integrity=",Simulation=,SnapEDA_Link=https://www.snapeda.com/parts/LM1117MPX-3.3/Texas+Instruments/view-part/?ref=snap,Value=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 +|RECORD=CatalogItem|ITEMTYPE=Automatic-NonVault|UNIQUEID=GeneralLib.IntLib\ABM3-8.000MHZ-D2Y-T|DESIGNITEMID=ABM3-8.000MHZ-D2Y-T|ITEMSOURCE=GeneralLib.IntLib|STATUS=Unknown|DESCRIPTION=8 MHz ±20ppm Crystal 18pF 140 Ohms 2-SMD, No Lead|USERCOMMENTS=8MHz|NOTE=|LINENUMBER=|SELECTEDPARAMETERSHASH=,"8 MHz ±20ppm Crystal 18pF 140 Ohms 2-SMD, No Lead",8MHz|COMPONENTPARAMETERS="Availability=In Stock",Check_prices=https://www.snapeda.com/parts/ABM3-8.000MHZ-D2Y-T/Abracon+LLC/view-part/?ref=eda,Comment=8MHz,"Component Kind=Standard","Description=8 MHz ±20ppm Crystal 18pF 140 Ohms 2-SMD, No Lead",Footprint=XTAL_ABM3-8.000MHZ-D2Y-T,"Ibis Model=","Library Name=GeneralLib.IntLib","Library Reference=ABM3-8.000MHZ-D2Y-T",MF=Abracon,MP=ABM3-8.000MHZ-D2Y-T,"Package=SMD-2 Abracon",PCB3D=,"Pin Info=",Price=None,Purchase-URL=https://pricing.snapeda.com/search/part/ABM3-8.000MHZ-D2Y-T/?ref=eda,"Signal Integrity=",Simulation=,SnapEDA_Link=https://www.snapeda.com/parts/ABM3-8.000MHZ-D2Y-T/Abracon+LLC/view-part/?ref=snap,Value=|CUSTOMPARAMETERS= +|RECORD=PartChoiceGroups|GROUPBYFIELDCOUNT=0 diff --git a/ArcadeStick_hardware/ArcadeStick.OutJob b/ArcadeStick_hardware/ArcadeStick.OutJob new file mode 100644 index 0000000..371d09d --- /dev/null +++ b/ArcadeStick_hardware/ArcadeStick.OutJob @@ -0,0 +1,181 @@ +[OutputJobFile] +Version=1.0 + +[OutputGroup1] +Name= +Description= +TargetOutputMedium=PDF +VariantName=[No Variations] +VariantScope=0 +CurrentConfigurationName= +TargetPrinter=Virtual Printer +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputMedium1=Print Job +OutputMedium1_Type=Printer +OutputMedium1_Printer= +OutputMedium1_PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputMedium2=PDF +OutputMedium2_Type=Publish +OutputMedium3=Folder Structure +OutputMedium3_Type=GeneratedFiles +OutputMedium4=Video +OutputMedium4_Type=Multimedia +OutputType1=Schematic Print +OutputName1=Schematic Prints +OutputCategory1=Documentation +OutputDocumentPath1=[Project Physical Documents] +OutputVariantName1=[No Variations] +OutputEnabled1=1 +OutputEnabled1_OutputMedium1=0 +OutputEnabled1_OutputMedium2=1 +OutputEnabled1_OutputMedium3=0 +OutputEnabled1_OutputMedium4=0 +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=0.70|XCorrection=1.00|YCorrection=1.00|PrintKind=0|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +Configuration1_Name1=OutputConfigurationParameter1 +Configuration1_Item1=Record=SchPrintView|ShowNoERC=True|ShowParamSet=True|ShowProbe=True|ShowBlanket=True|NoERCSymbolsToShow="Thin Cross","Thick Cross","Small Cross",Checkbox,Triangle|ShowNote=True|ShowNoteCollapsed=True|ShowOpenEnds=True|ExpandDesignator=True|ExpandNetLabel=False|ExpandPort=False|ExpandSheetNum=False|ExpandDocNum=False|PrintArea=0|PrintAreaRect.X1=0|PrintAreaRect.Y1=0|PrintAreaRect.X2=0|PrintAreaRect.Y2=0|DocumentPath= +OutputType2=PCB Print +OutputName2=PCB Prints +OutputCategory2=Documentation +OutputDocumentPath2=PCB1.PcbDoc +OutputVariantName2= +OutputEnabled2=1 +OutputEnabled2_OutputMedium1=0 +OutputEnabled2_OutputMedium2=2 +OutputEnabled2_OutputMedium3=0 +OutputEnabled2_OutputMedium4=0 +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=2.50|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +Configuration2_Name1=OutputConfigurationParameter1 +Configuration2_Item1=DesignatorDisplayMode=Physical|PrintArea=DesignExtent|PrintAreaLowerLeftCornerX=0|PrintAreaLowerLeftCornerY=0|PrintAreaUpperRightCornerX=0|PrintAreaUpperRightCornerY=0|Record=PcbPrintView|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name2=OutputConfigurationParameter2 +Configuration2_Item2=IncludeBoardCutouts=False|IncludeBottomLayerComponents=True|IncludeMultiLayerComponents=True|IncludeTopLayerComponents=True|IncludeViewports=True|Index=0|Mirror=False|Name=Multilayer Composite Print|PadNumberFontSize=14|Record=PcbPrintOut|ShowHoles=False|ShowPadNets=False|ShowPadNumbers=False|SubstituteFonts=False|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name3=OutputConfigurationParameter3 +Configuration2_Item3=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=TopOverlay|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name4=OutputConfigurationParameter4 +Configuration2_Item4=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=TopLayer|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name5=OutputConfigurationParameter5 +Configuration2_Item5=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=BottomLayer|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name6=OutputConfigurationParameter6 +Configuration2_Item6=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=MultiLayer|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name7=OutputConfigurationParameter7 +Configuration2_Item7=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=Mechanical1|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name8=OutputConfigurationParameter8 +Configuration2_Item8=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=Mechanical2|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name9=OutputConfigurationParameter9 +Configuration2_Item9=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=Mechanical3|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name10=OutputConfigurationParameter10 +Configuration2_Item10=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=Mechanical13|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +Configuration2_Name11=OutputConfigurationParameter11 +Configuration2_Item11=CArc=Full|CFill=Full|Comment=Full|Coordinate=Full|CPad=Full|CRegion=Full|CText=Full|CTrack=Full|CVia=Full|Designator=Full|Dimension=Full|DLayer1=TopLayer|DLayer2=BottomLayer|DrillType=Regular|FArc=Full|FFill=Full|FPad=Full|FRegion=Full|FText=Full|FTrack=Full|FVia=Full|Layer=Mechanical15|Polygon=Full|PrintOutIndex=0|Record=PcbPrintLayer|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +PcbPrintPreferences2= +OutputType3=BOM_PartType +OutputName3=Bill of Materials +OutputCategory3=Report +OutputDocumentPath3=ArcadeStick.BomDoc +OutputVariantName3=[No Variations] +OutputEnabled3=1 +OutputEnabled3_OutputMedium1=0 +OutputEnabled3_OutputMedium2=3 +OutputEnabled3_OutputMedium3=0 +OutputEnabled3_OutputMedium4=0 +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +Configuration3_Name1=General +Configuration3_Item1=TemplateFilename= + +[PublishSettings] +OutputFilePath2=F:\Workspace\Altium\ArcadeStick\.PDF +ReleaseManaged2=0 +OutputBasePath2=F:\Workspace\Altium\ArcadeStick\ +OutputPathMedia2= +OutputPathMediaValue2= +OutputPathOutputer2=[Output Type] +OutputPathOutputerPrefix2= +OutputPathOutputerValue2= +OutputFileName2=ArcadeStick.pdf +OutputFileNameMulti2= +UseOutputNameForMulti2=1 +OutputFileNameSpecial2= +OpenOutput2=1 +PromptOverwrite2=1 +PublishMethod2=0 +ZoomLevel2=50 +FitSCHPrintSizeToDoc2=0 +FitPCBPrintSizeToDoc2=0 +GenerateNetsInfo2=1 +MarkPins2=1 +MarkNetLabels2=1 +MarkPortsId2=1 +GenerateTOC2=1 +ShowComponentParameters2=1 +GlobalBookmarks2=0 +PDFACompliance2=Disabled +PDFVersion2=Default +OutputFilePath3= +ReleaseManaged3=1 +OutputBasePath3= +OutputPathMedia3= +OutputPathMediaValue3= +OutputPathOutputer3=[Output Type] +OutputPathOutputerPrefix3= +OutputPathOutputerValue3= +OutputFileName3= +OutputFileNameMulti3= +UseOutputNameForMulti3=1 +OutputFileNameSpecial3= +OpenOutput3=1 +OutputFilePath4= +ReleaseManaged4=1 +OutputBasePath4= +OutputPathMedia4= +OutputPathMediaValue4= +OutputPathOutputer4=[Output Type] +OutputPathOutputerPrefix4= +OutputPathOutputerValue4= +OutputFileName4= +OutputFileNameMulti4= +UseOutputNameForMulti4=1 +OutputFileNameSpecial4= +OpenOutput4=1 +PromptOverwrite4=1 +PublishMethod4=5 +ZoomLevel4=50 +FitSCHPrintSizeToDoc4=1 +FitPCBPrintSizeToDoc4=1 +GenerateNetsInfo4=1 +MarkPins4=1 +MarkNetLabels4=1 +MarkPortsId4=1 +MediaFormat4=Windows Media file (*.wmv,*.wma,*.asf) +FixedDimensions4=1 +Width4=352 +Height4=288 +MultiFile4=0 +FramesPerSecond4=25 +FramesPerSecondDenom4=1 +AviPixelFormat4=7 +AviCompression4=MP42 MS-MPEG4 V2 +AviQuality4=100 +FFmpegVideoCodecId4=12 +FFmpegPixelFormat4=0 +FFmpegQuality4=80 +WmvVideoCodecName4=Windows Media Video V7 +WmvQuality4=80 + +[GeneratedFilesSettings] +RelativeOutputPath2=F:\Workspace\Altium\ArcadeStick\.PDF +OpenOutputs2=1 +RelativeOutputPath3= +OpenOutputs3=1 +AddToProject3=1 +TimestampFolder3=0 +UseOutputName3=0 +OpenODBOutput3=0 +OpenGerberOutput3=0 +OpenNCDrillOutput3=0 +OpenIPCOutput3=0 +EnableReload3=0 +RelativeOutputPath4= +OpenOutputs4=1 + diff --git a/ArcadeStick_hardware/ArcadeStick.PrjPcb b/ArcadeStick_hardware/ArcadeStick.PrjPcb new file mode 100644 index 0000000..295fc75 --- /dev/null +++ b/ArcadeStick_hardware/ArcadeStick.PrjPcb @@ -0,0 +1,1319 @@ +[Design] +Version=1.0 +HierarchyMode=0 +ChannelRoomNamingStyle=0 +ReleasesFolder= +ChannelDesignatorFormatString=$Component_$RoomName +ChannelRoomLevelSeperator=_ +OpenOutputs=1 +ArchiveProject=0 +TimestampOutput=0 +SeparateFolders=0 +TemplateLocationPath= +PinSwapBy_Netlabel=1 +PinSwapBy_Pin=1 +AllowPortNetNames=0 +AllowSheetEntryNetNames=1 +AppendSheetNumberToLocalNets=0 +NetlistSinglePinNets=0 +DefaultConfiguration=Sources +UserID=0xFFFFFFFF +DefaultPcbProtel=1 +DefaultPcbPcad=0 +ReorderDocumentsOnCompile=1 +NameNetsHierarchically=0 +PowerPortNamesTakePriority=0 +AutoSheetNumbering=1 +AutoCrossReferences=1 +NewIndexingOfSheetSymbols=1 +PushECOToAnnotationFile=1 +DItemRevisionGUID= +ReportSuppressedErrorsInMessages=0 +FSMCodingStyle=eFMSDropDownList_OneProcess +FSMEncodingStyle=eFMSDropDownList_OneHot +IsProjectConflictPreventionWarningsEnabled=0 +ConstraintManagerFlow=0 +IsVirtualBomDocumentRemoved=0 +OutputPath= +LogFolderPath= +ManagedProjectGUID= +IncludeDesignInRelease=0 +CrossRefSheetStyle=1 +CrossRefLocationStyle=1 +CrossRefPorts=3 +CrossRefCrossSheets=1 +CrossRefSheetEntries=0 +CrossRefFollowFromMainSettings=1 + +[Preferences] +PrefsVaultGUID= +PrefsRevisionGUID= + +[Document1] +DocumentPath=Sheet1.SchDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=0 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 +DocumentUniqueId=QBKMNEGG + +[Document2] +DocumentPath=PCB1.PcbDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 +DocumentUniqueId=ICKEOPLQ + +[Document3] +DocumentPath=Job1.OutJob +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 +DocumentUniqueId= + +[Document4] +DocumentPath=ArcadeStick.BomDoc +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 +DocumentUniqueId= + +[Document5] +DocumentPath=..\Library\ArcadeStick.SchLib +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 +DocumentUniqueId= + +[Document6] +DocumentPath=..\Library\ArcadeStick.PcbLib +AnnotationEnabled=1 +AnnotateStartValue=1 +AnnotationIndexControlEnabled=0 +AnnotateSuffix= +AnnotateScope=All +AnnotateOrder=-1 +DoLibraryUpdate=1 +DoDatabaseUpdate=1 +ClassGenCCAutoEnabled=1 +ClassGenCCAutoRoomEnabled=0 +ClassGenNCAutoScope=None +DItemRevisionGUID= +GenerateClassCluster=0 +DocumentUniqueId= + +[GeneratedDocument1] +DocumentPath=Project Outputs for ArcadeStick\Design Rule Check - PCB1.html +DItemRevisionGUID= + +[GeneratedDocument2] +DocumentPath=Project Outputs for ArcadeStick\NC Drill\PCB1.DRR +DItemRevisionGUID= + +[GeneratedDocument3] +DocumentPath=Project Outputs for ArcadeStick\PCB1.DRR +DItemRevisionGUID= + +[GeneratedDocument4] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.EXTREP +DItemRevisionGUID= + +[GeneratedDocument5] +DocumentPath=Project Outputs for ArcadeStick\PCB1.EXTREP +DItemRevisionGUID= + +[GeneratedDocument6] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GBL +DItemRevisionGUID= + +[GeneratedDocument7] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GBL +DItemRevisionGUID= + +[GeneratedDocument8] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GBO +DItemRevisionGUID= + +[GeneratedDocument9] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GBO +DItemRevisionGUID= + +[GeneratedDocument10] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GBP +DItemRevisionGUID= + +[GeneratedDocument11] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GBP +DItemRevisionGUID= + +[GeneratedDocument12] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GBS +DItemRevisionGUID= + +[GeneratedDocument13] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GBS +DItemRevisionGUID= + +[GeneratedDocument14] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GD1 +DItemRevisionGUID= + +[GeneratedDocument15] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GG1 +DItemRevisionGUID= + +[GeneratedDocument16] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GM +DItemRevisionGUID= + +[GeneratedDocument17] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GM +DItemRevisionGUID= + +[GeneratedDocument18] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GTL +DItemRevisionGUID= + +[GeneratedDocument19] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GTL +DItemRevisionGUID= + +[GeneratedDocument20] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GTO +DItemRevisionGUID= + +[GeneratedDocument21] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GTO +DItemRevisionGUID= + +[GeneratedDocument22] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GTP +DItemRevisionGUID= + +[GeneratedDocument23] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GTP +DItemRevisionGUID= + +[GeneratedDocument24] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.GTS +DItemRevisionGUID= + +[GeneratedDocument25] +DocumentPath=Project Outputs for ArcadeStick\PCB1.GTS +DItemRevisionGUID= + +[GeneratedDocument26] +DocumentPath=Project Outputs for ArcadeStick\NC Drill\PCB1.LDP +DItemRevisionGUID= + +[GeneratedDocument27] +DocumentPath=Project Outputs for ArcadeStick\PCB1.LDP +DItemRevisionGUID= + +[GeneratedDocument28] +DocumentPath=Project Outputs for ArcadeStick\Gerber\PCB1.REP +DItemRevisionGUID= + +[GeneratedDocument29] +DocumentPath=Project Outputs for ArcadeStick\PCB1.REP +DItemRevisionGUID= + +[GeneratedDocument30] +DocumentPath=Project Outputs for ArcadeStick\NC Drill\PCB1.TXT +DItemRevisionGUID= + +[GeneratedDocument31] +DocumentPath=Project Outputs for ArcadeStick\PCB1.TXT +DItemRevisionGUID= + +[Configuration1] +Name=Sources +ParameterCount=0 +ConstraintFileCount=0 +ReleaseItemId= +Variant=[No Variations] +OutputJobsCount=0 +ContentTypeGUID=CB6F2064-E317-11DF-B822-12313F0024A2 +ConfigurationType=Source + +[OutputGroup1] +Name=Netlist Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=CadnetixNetlist +OutputName1=Cadnetix Netlist +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=CalayNetlist +OutputName2=Calay Netlist +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=EDIF +OutputName3=EDIF for PCB +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +OutputType4=EESofNetlist +OutputName4=EESof Netlist +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +OutputType5=IntergraphNetlist +OutputName5=Intergraph Netlist +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +OutputType6=MentorBoardStationNetlist +OutputName6=Mentor BoardStation Netlist +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +OutputType7=MultiWire +OutputName7=MultiWire +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +OutputType8=OrCadPCB2Netlist +OutputName8=Orcad/PCB2 Netlist +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +OutputType9=PADSNetlist +OutputName9=PADS ASCII Netlist +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +OutputType10=Pcad +OutputName10=Pcad for PCB +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +OutputType11=PCADNetlist +OutputName11=PCAD Netlist +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +OutputType12=PCADnltNetlist +OutputName12=PCADnlt Netlist +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +OutputType13=Protel2Netlist +OutputName13=Protel2 Netlist +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +OutputType14=ProtelNetlist +OutputName14=Protel +OutputDocumentPath14= +OutputVariantName14= +OutputDefault14=0 +OutputType15=RacalNetlist +OutputName15=Racal Netlist +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +OutputType16=RINFNetlist +OutputName16=RINF Netlist +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +OutputType17=SciCardsNetlist +OutputName17=SciCards Netlist +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +OutputType18=TangoNetlist +OutputName18=Tango Netlist +OutputDocumentPath18= +OutputVariantName18= +OutputDefault18=0 +OutputType19=TelesisNetlist +OutputName19=Telesis Netlist +OutputDocumentPath19= +OutputVariantName19= +OutputDefault19=0 +OutputType20=WireListNetlist +OutputName20=WireList Netlist +OutputDocumentPath20= +OutputVariantName20= +OutputDefault20=0 +OutputType21=XSpiceNetlist +OutputName21=Mixed Sim Netlist +OutputDocumentPath21= +OutputVariantName21= +OutputDefault21=0 + +[OutputGroup2] +Name=Simulator Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=AdvSimNetlist +OutputName1=Mixed Sim +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 + +[OutputGroup3] +Name=Documentation Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=Composite +OutputName1=Composite Drawing +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType2=Harness Layout Drawing Print +OutputName2=Harness Layout Drawing Prints +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType3=Harness Wiring Diagram Print +OutputName3=Harness Wiring Diagram Prints +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType4=PCB 3D Print +OutputName4=PCB 3D Print +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType5=PCB 3D Video +OutputName5=PCB 3D Video +OutputDocumentPath5= +OutputVariantName5=[No Variations] +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType6=PCB Print +OutputName6=PCB Prints +OutputDocumentPath6= +OutputVariantName6=[No Variations] +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType7=PCBDrawing +OutputName7=Draftsman +OutputDocumentPath7= +OutputVariantName7=[No Variations] +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType8=PCBLIB Print +OutputName8=PCBLIB Prints +OutputDocumentPath8= +OutputVariantName8=[No Variations] +OutputDefault8=0 +PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType9=PDF3D +OutputName9=PDF3D +OutputDocumentPath9= +OutputVariantName9=[No Variations] +OutputDefault9=0 +PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType10=PDF3D MBA +OutputName10=PDF3D MBA +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType11=Report Print +OutputName11=Report Prints +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType12=Schematic Print +OutputName12=Schematic Prints +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +PageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType13=SimView Print +OutputName13=SimView Prints +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +PageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 + +[OutputGroup4] +Name=Assembly Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=Assembly +OutputName1=Assembly Drawings +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType2=Pick Place +OutputName2=Generates pick and place files +OutputDocumentPath2= +OutputVariantName2=[No Variations] +OutputDefault2=0 +OutputType3=Test Points For Assembly +OutputName3=Test Point Report +OutputDocumentPath3= +OutputVariantName3=[No Variations] +OutputDefault3=0 +OutputType4=Wire Bonding Table +OutputName4=Wire Bonding Table Report +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 + +[OutputGroup5] +Name=Fabrication Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=CompositeDrill +OutputName1=Composite Drill Drawing +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType2=Drill +OutputName2=Drill Drawing/Guides +OutputDocumentPath2= +OutputVariantName2=[No Variations] +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType3=Board Stack Report +OutputName3=Report Board Stack +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType4=Final +OutputName4=Final Artwork Prints +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType5=Gerber X2 +OutputName5=Gerber X2 Files +OutputDocumentPath5= +OutputVariantName5=[No Variations] +OutputDefault5=0 +OutputType6=ODB +OutputName6=ODB++ Files +OutputDocumentPath6= +OutputVariantName6=[No Variations] +OutputDefault6=0 +OutputType7=Mask +OutputName7=Solder/Paste Mask Prints +OutputDocumentPath7= +OutputVariantName7=[No Variations] +OutputDefault7=0 +PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType8=NC Drill +OutputName8=NC Drill Files +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +Configuration8_Name1=ForceUpdateSettings +Configuration8_Item1=False +Configuration8_Name2=OutputConfigurationParameter1 +Configuration8_Item2=BoardEdgeRoutToolDia=2000000|GenerateBoardEdgeRout=False|GenerateDrilledSlotsG85=False|GenerateEIADrillFile=False|GenerateSeparatePlatedNonPlatedFiles=False|GenerateSeparateViaTypeFiles=False|GenerateToolsByDrillSymbols=False|NumberOfDecimals=4|NumberOfUnits=4|OptimizeChangeLocationCommands=True|OriginPosition=Relative|Record=DrillView|Units=Metric|ZeroesMode=SuppressTrailingZeroes|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc +OutputType9=IPC2581 +OutputName9=IPC-2581 Files +OutputDocumentPath9= +OutputVariantName9=[No Variations] +OutputDefault9=0 +OutputType10=Plane +OutputName10=Power-Plane Prints +OutputDocumentPath10= +OutputVariantName10=[No Variations] +OutputDefault10=0 +PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType11=Test Points +OutputName11=Test Point Report +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +OutputType12=Gerber +OutputName12=Gerber Files +OutputDocumentPath12= +OutputVariantName12=[No Variations] +OutputDefault12=0 +Configuration12_Name1=ForceUpdateSettings +Configuration12_Item1=False +Configuration12_Name2=OutputConfigurationParameter1 +Configuration12_Item2=AddToAllLayerClasses.Set= |AddToAllPlots.Set=SerializeLayerHash.Version~2,ClassName~TPlotLayerStateArray|BoardID=ICKEOPLQ|CentrePlots=False|DrillDrawingSymbol=GraphicsSymbol|DrillDrawingSymbolSize=500000|EmbeddedApertures=True|FilmBorderSize=10000000|FilmXSize=200000000|FilmYSize=160000000|FlashAllFills=False|FlashPadShapes=True|G54OnApertureChange=False|GenerateDRCRulesFile=False|GenerateDRCRulesFile=False|GenerateReliefShapes=True|GenerateReports=True|GerberUnit=Metric|GerberUnit=Metric|IncludeUnconnectedMidLayerPads=True|LayerClassesMirror.Set= |LayerClassesPlot.Set= |LeadingAndTrailingZeroesMode=SuppressLeadingZeroes|MaxApertureSize=2500000|MergePadAndRegion=False|MinusApertureTolerance=50|MinusApertureTolerance=50|Mirror.Set=SerializeLayerHash.Version~2,ClassName~TPlotLayerStateArray|MirrorDrillDrawingPlots=False|MirrorDrillGuidePlots=False|NoRegularPolygons=False|NumberOfDecimals=4|NumberOfDecimals=4|OptimizeChangeLocationCommands=True|OptimizeChangeLocationCommands=True|OriginPosition=Relative|OutputFormat=Different|Panelize=False|Plot.Set=SerializeLayerHash.Version~2,ClassName~TPlotLayerStateArray,16777217~1,16842751~1,16973830~1,16973831~1,16973834~1,16973835~1,16973832~1,16973833~1|PlotBoardProfile=True|PlotBoardProfileFileName= |PlotDrillDrawingLayerPair0_Backdrill=False|PlotDrillDrawingLayerPair0_Checked=True|PlotDrillDrawingLayerPair0_DrillType=Regular|PlotDrillDrawingLayerPair0_FileName= |PlotDrillDrawingLayerPair0_HighLayer=Bottom Layer|PlotDrillDrawingLayerPair0_LowLayer=Top Layer|PlotDrillGuideLayerPair0_Backdrill=False|PlotDrillGuideLayerPair0_Checked=True|PlotDrillGuideLayerPair0_DrillType=Regular|PlotDrillGuideLayerPair0_FileName= |PlotDrillGuideLayerPair0_HighLayer=Bottom Layer|PlotDrillGuideLayerPair0_LowLayer=Top Layer|PlotPositivePlaneLayers=False|PlotUsedDrillDrawingLayerPairs=False|PlotUsedDrillGuideLayerPairs=False|PlusApertureTolerance=50|PlusApertureTolerance=50|Record=GerberView|SoftwareArcs=False|Sorted=False|Sorted=False|DocumentPath=F:\Workspace\Altium\ArcadeStick\PCB1.PcbDoc + +[OutputGroup6] +Name=Report Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=BOM_PartType +OutputName1=Bill of Materials +OutputDocumentPath1= +OutputVariantName1=[No Variations] +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType2=BOM_ReportCompare +OutputName2=BOM Compare +OutputDocumentPath2= +OutputVariantName2=[No Variations] +OutputDefault2=0 +PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType3=ComponentCrossReference +OutputName3=Component Cross Reference Report +OutputDocumentPath3= +OutputVariantName3=[No Variations] +OutputDefault3=0 +OutputType4=Export Comments +OutputName4=Export Comments +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType5=Project History +OutputName5=Project History +OutputDocumentPath5= +OutputVariantName5=[No Variations] +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType6=ReportHierarchy +OutputName6=Report Project Hierarchy +OutputDocumentPath6= +OutputVariantName6=[No Variations] +OutputDefault6=0 +OutputType7=Script +OutputName7=Script Output +OutputDocumentPath7= +OutputVariantName7=[No Variations] +OutputDefault7=0 +OutputType8=SimpleBOM +OutputName8=Simple BOM +OutputDocumentPath8= +OutputVariantName8=[No Variations] +OutputDefault8=0 +OutputType9=SinglePinNetReporter +OutputName9=Report Single Pin Nets +OutputDocumentPath9= +OutputVariantName9=[No Variations] +OutputDefault9=0 +OutputType10=BOM_ReportManufacturing +OutputName10=Manufacturing Data +OutputDocumentPath10= +OutputVariantName10=[No Variations] +OutputDefault10=0 + +[OutputGroup7] +Name=Other Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=Text Print +OutputName1=Text Print +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 + +[OutputGroup8] +Name=Validation Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=BOM_Violations +OutputName1=BOM Checks Report +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=Component states check +OutputName2=Server's components states check +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=Configuration compliance +OutputName3=Environment configuration compliance check +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +OutputType4=Design Rules Check +OutputName4=Design Rules Check +OutputDocumentPath4= +OutputVariantName4= +OutputDefault4=0 +PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType5=Differences Report +OutputName5=Differences Report +OutputDocumentPath5= +OutputVariantName5= +OutputDefault5=0 +PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType6=Electrical Rules Check +OutputName6=Electrical Rules Check +OutputDocumentPath6= +OutputVariantName6= +OutputDefault6=0 +PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 +OutputType7=Footprint Comparison Report +OutputName7=Footprint Comparison Report +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 + +[OutputGroup9] +Name=Export Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=AutoCAD dwg/dxf PCB +OutputName1=AutoCAD dwg/dxf File PCB +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 +OutputType2=AutoCAD dwg/dxf Schematic +OutputName2=AutoCAD dwg/dxf File Schematic +OutputDocumentPath2= +OutputVariantName2= +OutputDefault2=0 +OutputType3=ExportIDF +OutputName3=Export IDF +OutputDocumentPath3= +OutputVariantName3= +OutputDefault3=0 +OutputType4=ExportPARASOLID +OutputName4=Export PARASOLID +OutputDocumentPath4= +OutputVariantName4=[No Variations] +OutputDefault4=0 +OutputType5=ExportSTEP +OutputName5=Export STEP +OutputDocumentPath5= +OutputVariantName5=[No Variations] +OutputDefault5=0 +OutputType6=ExportVRML +OutputName6=Export VRML +OutputDocumentPath6= +OutputVariantName6=[No Variations] +OutputDefault6=0 +OutputType7=MBAExportPARASOLID +OutputName7=Export PARASOLID +OutputDocumentPath7= +OutputVariantName7= +OutputDefault7=0 +OutputType8=MBAExportSTEP +OutputName8=Export STEP +OutputDocumentPath8= +OutputVariantName8= +OutputDefault8=0 +OutputType9=Save As/Export PCB +OutputName9=Save As/Export PCB +OutputDocumentPath9= +OutputVariantName9= +OutputDefault9=0 +OutputType10=Save As/Export Schematic +OutputName10=Save As/Export Schematic +OutputDocumentPath10= +OutputVariantName10= +OutputDefault10=0 +OutputType11=Specctra Design PCB +OutputName11=Specctra Design PCB +OutputDocumentPath11= +OutputVariantName11= +OutputDefault11=0 +OutputType12=Web ReviewOutputName +OutputName12=Web Review Data +OutputDocumentPath12= +OutputVariantName12= +OutputDefault12=0 +OutputType13=Ansoft Neutral +OutputName13=Ansoft Neutral (AutoPCB) +OutputDocumentPath13= +OutputVariantName13= +OutputDefault13=0 +OutputType14=HyperLynx +OutputName14=HyperLynx (AutoPCB) +OutputDocumentPath14= +OutputVariantName14= +OutputDefault14=0 +OutputType15=MathWorks +OutputName15=MathWorks (AutoPCB) +OutputDocumentPath15= +OutputVariantName15= +OutputDefault15=0 +OutputType16=Orcad v7 Capture Design +OutputName16=Orcad v7 Capture Design (AutoSCH) +OutputDocumentPath16= +OutputVariantName16= +OutputDefault16=0 +OutputType17=P-CAD ASCII +OutputName17=P-CAD ASCII (AutoPCB) +OutputDocumentPath17= +OutputVariantName17= +OutputDefault17=0 +OutputType18=P-CAD V16 Schematic Design +OutputName18=P-CAD V16 Schematic Design (AutoSCH) +OutputDocumentPath18= +OutputVariantName18= +OutputDefault18=0 + +[OutputGroup10] +Name=PostProcess Outputs +Description= +TargetPrinter=HP HP Laser 103 107 108 +PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 +OutputType1=Copy Files +OutputName1=Copy Files +OutputDocumentPath1= +OutputVariantName1= +OutputDefault1=0 + +[Modification Levels] +Type1=1 +Type2=1 +Type3=1 +Type4=1 +Type5=1 +Type6=1 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=1 +Type12=1 +Type13=1 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=1 +Type26=1 +Type27=1 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=1 +Type33=1 +Type34=1 +Type35=1 +Type36=1 +Type37=1 +Type38=1 +Type39=1 +Type40=1 +Type41=1 +Type42=1 +Type43=1 +Type44=1 +Type45=1 +Type46=1 +Type47=1 +Type48=1 +Type49=1 +Type50=1 +Type51=1 +Type52=1 +Type53=1 +Type54=1 +Type55=1 +Type56=1 +Type57=1 +Type58=1 +Type59=1 +Type60=1 +Type61=1 +Type62=1 +Type63=1 +Type64=1 +Type65=1 +Type66=1 +Type67=1 +Type68=1 +Type69=1 +Type70=1 +Type71=1 +Type72=1 +Type73=1 +Type74=1 +Type75=1 +Type76=1 +Type77=1 +Type78=1 +Type79=1 +Type80=1 +Type81=1 +Type82=1 +Type83=1 +Type84=1 +Type85=1 +Type86=1 +Type87=1 +Type88=1 +Type89=1 +Type90=1 +Type91=1 +Type92=1 +Type93=1 +Type94=1 +Type95=1 +Type96=1 +Type97=1 +Type98=1 +Type99=1 +Type100=1 +Type101=1 +Type102=1 +Type103=1 +Type104=1 +Type105=1 +Type106=1 +Type107=1 +Type108=1 +Type109=1 +Type110=1 +Type111=1 +Type112=1 +Type113=1 +Type114=1 +Type115=1 +Type116=1 +Type117=1 +Type118=1 +Type119=1 +Type120=1 +Type121=1 +Type122=1 +Type123=1 +Type124=1 +Type125=1 +Type126=1 +Type127=1 +Type128=1 +Type129=1 +Type130=1 +Type131=1 +Type132=1 +Type133=1 +Type134=1 +Type135=1 +Type136=1 +Type137=1 +Type138=1 +Type139=1 +Type140=1 +Type141=1 +Type142=1 +Type143=1 +Type144=1 +Type145=1 +Type146=1 +Type147=1 +Type148=1 +Type149=1 +Type150=1 +Type151=1 +Type152=1 +Type153=1 +Type154=1 +Type155=1 +Type156=1 +Type157=1 +Type158=1 +Type159=1 +Type160=1 +Type161=1 + +[Difference Levels] +Type1=1 +Type2=1 +Type3=1 +Type4=1 +Type5=1 +Type6=1 +Type7=1 +Type8=1 +Type9=1 +Type10=1 +Type11=1 +Type12=1 +Type13=1 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=1 +Type21=1 +Type22=1 +Type23=1 +Type24=1 +Type25=1 +Type26=1 +Type27=1 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=1 +Type33=1 +Type34=1 +Type35=1 +Type36=1 +Type37=1 +Type38=1 +Type39=1 +Type40=1 +Type41=1 +Type42=1 +Type43=1 +Type44=1 +Type45=1 +Type46=1 +Type47=1 +Type48=1 +Type49=1 +Type50=1 +Type51=1 +Type52=1 +Type53=1 +Type54=1 +Type55=1 +Type56=1 +Type57=1 +Type58=1 +Type59=1 +Type60=1 +Type61=1 +Type62=1 +Type63=1 +Type64=1 +Type65=1 +Type66=1 +Type67=1 +Type68=1 +Type69=1 +Type70=1 +Type71=1 +Type72=1 +Type73=1 +Type74=1 +Type75=1 +Type76=1 +Type77=1 +Type78=1 +Type79=1 +Type80=1 +Type81=1 +Type82=1 +Type83=1 +Type84=1 +Type85=1 +Type86=1 +Type87=1 +Type88=1 + +[Electrical Rules Check] +Type1=1 +Type2=1 +Type3=2 +Type4=1 +Type5=2 +Type6=2 +Type7=0 +Type8=1 +Type9=1 +Type10=1 +Type11=2 +Type12=2 +Type13=2 +Type14=1 +Type15=1 +Type16=1 +Type17=1 +Type18=1 +Type19=1 +Type20=0 +Type21=0 +Type22=0 +Type23=0 +Type24=1 +Type25=2 +Type26=0 +Type27=2 +Type28=1 +Type29=1 +Type30=1 +Type31=1 +Type32=2 +Type33=0 +Type34=2 +Type35=1 +Type36=2 +Type37=1 +Type38=2 +Type39=2 +Type40=2 +Type41=0 +Type42=2 +Type43=1 +Type44=0 +Type45=0 +Type46=0 +Type47=0 +Type48=0 +Type49=0 +Type50=2 +Type51=0 +Type52=0 +Type53=1 +Type54=1 +Type55=1 +Type56=2 +Type57=1 +Type58=1 +Type59=2 +Type60=0 +Type61=0 +Type62=0 +Type63=0 +Type64=0 +Type65=2 +Type66=3 +Type67=2 +Type68=2 +Type69=0 +Type70=2 +Type71=2 +Type72=2 +Type73=2 +Type74=1 +Type75=2 +Type76=1 +Type77=1 +Type78=1 +Type79=1 +Type80=2 +Type81=3 +Type82=3 +Type83=3 +Type84=3 +Type85=3 +Type86=2 +Type87=2 +Type88=2 +Type89=1 +Type90=1 +Type91=3 +Type92=3 +Type93=2 +Type94=2 +Type95=2 +Type96=2 +Type97=2 +Type98=0 +Type99=1 +Type100=2 +Type101=0 +Type102=2 +Type103=2 +Type104=1 +Type105=2 +Type106=2 +Type107=2 +Type108=2 +Type109=1 +Type110=1 +Type111=1 +Type112=1 +Type113=1 +Type114=2 +Type115=2 +Type116=2 +Type117=3 +Type118=3 +Type119=3 +MultiChannelAlternate=0 +AlternateItemFail=3 +Type122=2 +Type123=1 +Type124=1 +Type125=1 +Type126=1 +Type127=1 +Type128=2 +Type129=2 +Type130=2 +Type131=2 +Type132=2 +Type133=2 +Type134=2 +Type135=2 +Type136=2 +Type137=2 +Type138=1 +Type139=1 +Type140=1 +Type141=1 +Type142=1 +Type143=1 +Type144=1 +Type145=1 +Type146=1 +Type147=2 +Type148=2 +Type149=2 +Type150=2 +Type151=2 +Type152=1 +Type153=1 +Type154=0 +Type155=0 +Type156=0 +Type157=0 +Type158=0 +Type159=0 +Type160=0 +Type161=0 +Type162=1 +Type163=1 +Type164=1 +Type165=2 + +[ERC Connection Matrix] +L1=NNNNNNNNNNNWNNNWW +L2=NNWNNNNWWWNWNWNWN +L3=NWEENEEEENEWNEEWN +L4=NNENNNWEENNWNENWN +L5=NNNNNNNNNNNNNNNNN +L6=NNENNNNEENNWNENWN +L7=NNEWNNWEENNWNENWN +L8=NWEENEENEEENNEENN +L9=NWEENEEEENEWNEEWW +L10=NWNNNNNENNEWNNEWN +L11=NNENNNNEEENWNENWN +L12=WWWWNWWNWWWNWWWNN +L13=NNNNNNNNNNNWNNNWW +L14=NWEENEEEENEWNEEWW +L15=NNENNNNEEENWNENWW +L16=WWWWNWWNWWWNWWWNW +L17=WNNNNNNNWNNNWWWWN + +[Annotate] +SortOrder=3 +SortLocation=0 +ReplaceSubparts=0 +MatchParameter1=Comment +MatchStrictly1=1 +MatchParameter2=Library Reference +MatchStrictly2=1 +PhysicalNamingFormat=$Component_$RoomName +GlobalIndexSortOrder=3 +GlobalIndexSortLocation=0 + +[PrjClassGen] +CompClassManualEnabled=0 +CompClassManualRoomEnabled=0 +NetClassAutoBusEnabled=1 +NetClassAutoCompEnabled=0 +NetClassAutoNamedHarnessEnabled=0 +NetClassManualEnabled=1 +NetClassSeparateForBusSections=0 + +[LibraryUpdateOptions] +SelectedOnly=0 +UpdateVariants=1 +UpdateToLatestRevision=1 +PartTypes=0 +FullReplace=1 +UpdateDesignatorLock=1 +UpdatePartIDLock=1 +PreserveParameterLocations=1 +PreserveParameterVisibility=1 +DoGraphics=1 +DoParameters=1 +DoModels=1 +AddParameters=0 +RemoveParameters=0 +AddModels=1 +RemoveModels=1 +UpdateCurrentModels=1 + +[DatabaseUpdateOptions] +SelectedOnly=0 +UpdateVariants=1 +UpdateToLatestRevision=1 +PartTypes=0 + +[Comparison Options] +ComparisonOptions0=Kind=Net|MinPercent=75|MinMatch=3|ShowMatch=0|UseName=-1|InclAllRules=0 +ComparisonOptions1=Kind=Net Class|MinPercent=75|MinMatch=3|ShowMatch=0|UseName=-1|InclAllRules=0 +ComparisonOptions2=Kind=Component Class|MinPercent=75|MinMatch=3|ShowMatch=0|UseName=-1|InclAllRules=0 +ComparisonOptions3=Kind=Rule|MinPercent=75|MinMatch=3|ShowMatch=0|UseName=-1|InclAllRules=0 +ComparisonOptions4=Kind=Differential Pair|MinPercent=50|MinMatch=1|ShowMatch=0|UseName=0|InclAllRules=0 +ComparisonOptions5=Kind=Structure Class|MinPercent=75|MinMatch=3|ShowMatch=0|UseName=-1|InclAllRules=0 + +[SmartPDF] +PageOptions=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 + diff --git a/ArcadeStick_hardware/ArcadeStick.pdf b/ArcadeStick_hardware/ArcadeStick.pdf new file mode 100644 index 0000000000000000000000000000000000000000..89b61da4c527600c7694f483a1aabdf4d1308418 GIT binary patch literal 672545 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ⅅ7cK#O7KUfE+Y>|w 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 G=l=yP3xinz literal 0 HcmV?d00001 diff --git a/ArcadeStick_hardware/FabDocuments.zip b/ArcadeStick_hardware/FabDocuments.zip new file mode 100644 index 0000000000000000000000000000000000000000..969ab11ddbba4b12ec5cb3bc5f076c523b5915ae GIT binary patch literal 35113 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%0A&eu7SH$jkhS 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

?b2_IV~^* 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%0D>Rr32#qFL02+PxqkVnRD3Do5*D3&+ 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

<~Yn(g=` zjdnd!b%CiDOuJ{7vq1N~2)rgL+F;RStF}4e_K+JwxpM93 z1*0o&=*^XnXo7b`efpcFkqWqBnKk!yAA4$=7qf{6HeolUew#_pZK}q8{P)Gdw~4n{v>b$J#t@ ziQ@N*c(b@&WY&ndU&J~aW}Cjknh=XpkPpSk88K^QjSnUr~1#6=~;_ zB~U}!jc!0#Nd`5GIf0yJhxU@I!bt(p9;rf&VSzre9te^c?{?Gtxhb*oiZZ(G>nzV;VO&Y!@E+NfEh zwfM2?UB|O5$M*impoeM>k#4S$sl-HWLC==A zDluldg>Fc)88;9gt81i->6*KmU5SKxF;j_zO3Fq?K)JZOvv$$zper zDb6WLTJ~M|b?%MIxPX+@%@mP_&uCMB>8@&%9{P?NNOFG%isd`OUQ`g(Y{d;T0&07V!IND_U_xS2 zwsy&Wh(Pv8&t%ULWzhpHyHd8rnv`v^+tgtSU`<9LL>DSp6N+;A+o*#^PA!uEJ6y1g zm@b}OJWO9W?v)4W@v+7h=}0@d#af7wn4PEiQ&B=`1ihFVCDaa640c*4gJeH_RmtC4 zmf-WyJbbp1@oSqB4`u)cJbJGLxhhQq3;ZFLHy8Wi`aW7HNvT5>0m`9GT23$%z$4C=V!FaK%JSEAHZNRx2J31)H|w zea!u@{CawAx&B&G+wxjc+XWY0+c2~luljQN?kgHYdOB}F+LiqU84=3Ls1i54bpjP0 z#dSm+_8SAzkvcM-+9tc}>Ku+9yd^W9VKTDIBW1un%~Tx1ZE1BLg>cK>N2v8E)YzZB zwM&T!9ggv^&N`e8kA&GU>@W<&4#V(lOlX2uEl%Juf)tE<9F#2w#8`UnZk6NbQb)sCA%shAwC@dvyS8u=umbx4sK*(+=9lGjt?j>T;GCcO=1ah!NZvP9>YO%6#))wTs9 z}cOt$Z;Mu8T$B7)nMJ1!Ny-3bqB0tFIry%33jf~_#0YDZY z&xs-c(Hbfjg#w$BT0M~5)TvE5@}v`OrOE8(C4a#`EMHs`i1lyU@WDpr?&-_hyqK-K z{KJu~&!dg-X|pH0M(c1huEzBK_N$h)BpZf=&-U`caQGt0yvkx--2DJfnz~x~pqa6C zM0Mp~6+E%f8ZP%wx8bHxlMd3N-cMTP!=zOpk5DV>!C#f@YIWX-WEI?g@<9g8LAQ%_ z__e%-V=+;04Yq1-}HhS1=wd?XBGX%@athL40fI3eHlY&e`XwRy$3)E13&?Mf

X(u$7>m)u)J1=cN4PT>XEdV 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 z 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�%+tu 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%0D2yXpmP7Kf9S6~2E=zyBtEB7N^K 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 tLI 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%0A=i4U4t4Q(v`BUE22v$0KMwS_N3U)sE-3T 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 |X{mUz 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%0DD;Ec8LTU*87$1s4l+pH5 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

TQcs)EHe9v(^(J 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%0DmmdDSYZe9gSmoxNB5M|B_D-32#-a+Vw9Ct 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

fBz#bv2 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

9VzM@6c{kww~n>HK&|;Vtp6MWTf>M zlww=R{RrhL@bik=&CY7~hWPNC05RrquqttM#cyREr9G%|Qdu7=hbiVI4@HHV2R-;R zfH4=y59G9U{D#*(-y#y%n1zcHNthqhNkn~xr=iER!P(IX}? z@BKRTKFL*%OFX`0cpZv^M;g3+>pb{S|GFJAx8!ks!8I;NRPV5&HPZK~bUfp~_6uv0 z5b$(i-Pojx+V9tTBG&hwy8$`wBZ4%=-6K_S4z_0ZqFf-UQ8XY3g%V{$rMu2)5`TQ9 z!jaaPeEE>R+V|5v3R;q%`3KO)LH&{L6VT$6rr%C;zt?@&ELTjqWJWSaY^#S_dzAB- z8RDbdXjSRUcXcP$L1*64c>b)&+V4vFCJQp}A45jwOjTmdYiD2AMWWAs@vgej;TLW2 zZe>Ur-$HUA+um|r7M@XO!!OK4nO&9#h-4~*HDq=x39-gz^T-=JPH=sjI`64`6?-0M z6bX5i75STYdi+;feJcs~;AWt@>>5yASX-=ij3FPNiqV@uVxaEvU_EqF@kc=ImRqKp z8LKO-w;47=Y_)j|g|(8PzQEWm!+fCboAM;^+SSo#mdx^YZ z)3z0WQ=N+he_6iKAva&&ulJN|soU=han>+wPXjt5?a3&``Zcd7LwCCb;j?ASp92i3 zRD6+(HnvxMY&U!TT9^IW>-2-hZvD7$R3K}u7XwxA6INaZK2`wQ0AnpYhyhkz;{Y2u zLJ9^ol-1jSo4|FwBp6M1=9KPKBgW8vvVC&9p$FKgwn!e=r9lBEE;E|Lgy!Y1OM|zP z;sT87mYJ2lr{M_H?|%<|5pu)E3OGtl?}W1jJa0tFkGIZ@st(%>lccUg@CMxIM5$v} z?$5(v*(UjVz~crYTawHkksWZIU546sEa0?5vI{lnQ7-(Zu%Pt80>)aH_3$a;2XkuuAWuZs+kZO|XUFW%W%L-`Qf&i~-+qR-n zX*r~1Er(1{N=gsYwP;qR5Focd*BstYiC6Nf9=nDloYmZ?4QQx@*U;@Vw6o(ktwIfb zXPw1^msG2!A9zDrNv&MEMnYhJ{$W7tXC?N1mVQc?$E!S0ee;#Nl5FOOsA!~%`?IO0 z)JTQ~z6pE@DsEobEh%z!{R#2fLnubf@nOguN-H&LDp^0{J+(oSk&I7oi%JAJ@ChMH z;+17;V*Sb+icqq0Kj5V)Lp4u$o-cC6p$TCLbLr(mUHT-Ky;t5hY!Gs z|KI(?U;g}WWUfb#HIKTsDDoMqdS!?UeE^ho z@iAqc!7G}dxKQqu4NkdmS}DqsvA7R=wIRY+aI>MT#~Y~G%nt!}SNu;xdI%Z5i5LuV z0&8Kg8easHjDg-LD#UfIS_Vk5(82-%Q{l>LX^Z@g_bHL;Lp^xInoj1LE64{Ex{)-%WAiC#Q~K-T;|woQBPjfIH&Jm*%Y?69E%+=*2rKh-WefE!b5dJ;B- zj(cyK@K{7n0Q?<(pQzjF^1=@(gsOKRj{N9Fj3di!qwpT`P9;bkH@eZZ?$P$kA3m+l zhJwuet8VqU!}6EI`RL7MbA|_-3wn2u@bWDkWQ1U*Ad7w zRgz^jE9divmLSm5ScP(0L(xB|TuwHu>LStIXQvn45^e)lU8`SxbmP)`Tq|xwcOD~o ziq@0NW;zSeNAB;tF|I+!+5em25v_l^QTJA% zruwvWKB|J*25F5XJUC+B_L7jPxx_}<5)(kTaYcWEr{T!UvEaXI*%kdx0xVl`x3I)F zxVmo=Afn%J{A#SQRmf!8z-$_H@^_TGJ1!jWSWaq=pA`1n(QlHYP}8vbUimxpOaix=7GY%b;F0jU=zK@|D9?;=JNQ7^ z78evp;-D2fh#Lb|n34!PEUf7Il21JGLwz&ejBs5w{N33NaXQyz_JD7WUv4)&+ks^F&{ziVZ1~%reFWTu6l3FaO%i2ft zcgB#uT{JY}taGA`xDpipXH1Le}jl zmj*E`PJ|k}A`4U=mRpfZtKQ{T) zJlhtesKM90TvbPkWsSaBRt@oP@O)KTD&hg>u@VyuMW^fM3N)EZ_)CK9sD(1gz_r%S zE5)DXl1>YEyWtx+rCKlN?hbRg_@XpZW-UK`4fJsA>UR5xHR-2~RaxTuERy&TM6{K= zTtWY%b>@$WMzT`+JkPM6`sYo>{8U%A1o(CJ4f@!q;(2)4T-t{nK-Rf#O43LLFmPd9 zxk}a|@>ICA3-sB4W1p1;{jn8nv=1P1Db|$!b?}d@;oW_9-R_s2w8PLvo@;?1HxA;F zuYy=Hs2*2+g+Gj69C;mJcI9@CQ^CuA`-uGwXZ@R-Ees=X6|-|qzm0ru$w96Vh`c&W zTRDz{~mi08q|(7gmM){9t0ZkJ=VPnyw{^d~22h>-gWxDqthNZ;y+3V`(`~u(B=` zgccg9Se9Yv*WtKuKiwA#*jO0jju%s)LqXcQ_VfH1Ofm0u#+Da4uN; zCiZxGldo0CqxGQgttP3x!j(ZcifB~exd?!`%Ap{pNxXjnh_W#ztn0lR6Dg}wZ?hQ9 zYG!(6Z^s8g1pjluo zK>W=k3#m%VY3dz$FOEHyw)s6PYrZbA_io6zWzu^mGc@Ldi2W*}K0GsiC6x&}V79Sk zj!J@If5sd?EBWtq^yNK3A5rCVC9#lGSzp2EDk1i|X)*7xK$G(wC?(E1^9s_if}<}b zM9;CzYivs4c_G&d6zT;a&tSb?Nk2cwCbxut+*=$;)-4~9cd8$dN*jLZx>%jC5wT$M zuB$*MN8gwmL}6E_QGzI|I7gM+Q(1|RR2q}D_V1NY_Z0Vom*l=8e5sOOyLA(DE4Ki( zQ2PPsGwI9ZHdF|JZ1lH-D=i8xDzDJB+mmZ7c@9aE?jQARIs+WIq>;h25SYGUp&Twm zy2+1}l~Ce~B1-0~x?=JZq)g@lXY%pUc!9o-mHZA?CIIxOja)J~7wkx;K-HmP30Ve7 zH7s6pW;HGOUarVwY0Z%C=yqg&66b4i$B#Bw#b)sA*gq-!KUU{#h&eSF4RG;Cie)5r z`g^B#>bZrqCUB=;UUtvo;~Yw0p-E}~<>8MM(NEUaKapm2k8w@GHhD==L;tKB+n9Df z`_sOP;!Q9q$xcM;W}>=_;$?!N8=xyHuRi2DSb(+78UWNW4@``Qkz*)4#?%`R zCCKA7H$%v)HFwtR#$TkmMFE4nu>kaNq%94)p=U^88!b`#kKHU@(+8R~9)qK$qC z1QXY578shFe|uD#M}41#6iCXIr%0kbff{c{6ZKtI8XjgGQSfsiceu4gYjK*Z(gQ~( zO!Eb2>BrqXOgEGaVcTpJIW^Wk)286okCWo9toa!B`1uG zi2X?$5XlzPou+t@6+$vu5Bm;7CR=1JP)}9MC9Qez2OX==7+NXZCy<MkAq1lnbpcD9m8Oe}ibMQSDTAo$F!^#jU;`6%v#&9PWdop3VvGtwqZ)HO;J@xHc zOGqb$B9m*BQQB<2soBX2k$zsKN;O^O?~V4EK0&wzERCzj$pvk3G-3RogIuBK5OyD=b!ikFh&IvJ0W zT308$i5EOuO;>UKOdI^V0{?Otq%DD;h#eXAVufrH-O{ zf_7rGVsU%_wXr&Su4wToEy-Kh7Y3gna*rL@r`Bl!n3bDVMvcij=;u;WLHCK`?+CH} zS@Em2wY1hMmQWE&Zen#qK&l^a%fttJ4rnT@@1six#+;U!O+JS*`H)TQ0^}rnS`MKv zS6WMZF}4Eds_2{-;YUibNmcVglKyO#&)CeXnZ9O=Uvp1iF8FyOZwa~KvnK07&wQVq z+H^hCs}7NnwV#iOq@4T%x%m22d8B0BeOyv1Ty^zZ6%?|&FIvuSEDiil2$)|~??DJe zzK|g~@q;2-CwzlwKwwp)be6nX_eNTo?RA9Nq3*P8a?Ty!! z!meG!#8b1bHX4v0&`!hbcJj?SJHz<14Q+VwVP{5}-Pl4#;_CPci}G2UR_1+JMBjPl z0t+*z`I%SmX#vrX83kXWzV6LvP zgxX!K_%8&R^A021Cu4{0P zK#)Oi;!(1YaA{h8MkLHQNjwyb)r73Lr{M!phEH=|nx*Tcb{T~tUldKBXN|ZMYAH}! zUeyLoXG%Q=?wadtra9Z)kzeicOQ*~9aCs8FO2$E zaZZhUG7RPYnd$<_%Fw6p>tZT}L*vyETU3HCky55;*mUS)l~-tn1wh_)C}&D?nBYyi#x6 z#{fG5wVL~ld)OY8BQ{@lctR&lrGVg>gV7k&L81Rv6Y@g=y{R{#v+SpL#mIbbuy`Vh zE;$jdI{BGL)hJ0@Er$ro8hssl1h{sNIO{9VJ4@*vA^yvz@9vB;OnBg#kf0XiDPjYNjhOQTxSyH*U-N^>Qp(7XO?6WwA@bPSMqru zJ?v&?$dLEq<(+P`4z0dSKb15uz1`Qb>lh7MJMZMDqFcXrvMIi^^Ul^; zp21;@rSa?dTO|^6+K_?nR7vNqiVIOvRR_KG`R~Iq<#dxFjl7WpG6}xw^JeR2Pwbwo zwx9uOsw5lohJyJ;-^&GvBwGV~28H&J;sZouQ@q)(iktPI_YRr^EZT9_3O}AK$(gc? zRwvIYU$WpTStmOH#H{nM)`uG^G7K9T&5IiG=YT?nlB85eUeyAWB?Q}hty5?3iv+K1 zz6G7&W2gtx%zIt!cdA?=-vcuR)Lh8MG&uMHc39DL*TU>Iw&b*xfVsSU2>nTSI^fFX zc2qbn6_po8v~o+DEgUi>9?Ol6Y^qLMK!{@HxGG1V>+@p-8`2nx*BVIL!~I*{pb<+% zfNh?ao!gXp&aqa*SS2g}C9wQZFJly4_^I!-$H(r+jP+7M zkyX`EI|)Qf%j2I1*zw#5{bTW6L4aIq;!~j{AS?MkBihi(y~*h#<6C{1R$uYe^z@@j z4@k&R#Ih1sle6@*kDDsFyu!H1jyEo2zV&w2ee2&Z0>NA_fr;Jfx7WGO)UQZ8bmK@I zx&;Z&>yQ!!SS3*gdnhzoQ+{dhdb>u2On3cln?(kBf=QL>clxEZJ(5@uV(_YVT?y1~ znzrWd`^3At_Sx-7j(6F}H4~10L4z^C2^6RGItp)`LAZhZxHN(0#_Mv!+hBg#o#|!E zx>!YbD;013dFsP0Llx9J6JqSvK%)B=2wJFVFllu{m$4jOGxJ+;pssCC35ZD!E;n4t9Q%Q+ z%)6>Ga=*D}w^Pc`qcxDKV2{p4IV998@-7mw6e_Ii$fw#0rKh|6*CSAyS0&zdHNCHDnW9!=o!iR z=9i7ydD?&3@hklWjXgJ)UGTv~rlBOYziAic6Sz-yJgtz0N?A~2vkd@m9eOhHG*UfS z0d!&9j{LY*Ao?`O8u#Z=GlEi8Kt;<`XRTRGz~Hz#W9p>V*A<=$&TSdOKb?$@Rg30T z{BZ$axN&a`YYjCoyP#2IG*;7DAL}s}Hfn4!q3_n0F!jB>YW2P7ugdMtW%g07Zz>O9 zoKSWBIHc`yS)jWU{U-O@LE>MV$cr1!ku5h4-nb)=mD*b8RLyQq7m^#&UI><&-(K}St9n>s=GoQS_uVYFjhm5 zsV>CD-C8$sQ?oAS-!rs}3%PshG(mgG#3`<;5|$RsIrdGHG|;GhSsA3-l2i`f!FW+V zyxDZuOxOxg)5^Dqd`PK(#2YKiX~`k!dI=Psm7ihf!5`GM+hKpwX@Bq87aGlh>vDD4 zYtCS5dox>R-JLx+oassorPqAFVr4&u*f8gX+F^G2M}y$Vc|~uw4ifJd5w&Dg$lo|L zO{~05^<9THf#UIYDp1|!uNo7#KX@F_yqo!03w$Bx<;X0qeKZpo^#Oq@(%cdr&nfjO z@rv|~s`2y?lQD_z_NkmR8Nd)Jq`b9UN8mZh}1aK(#ce9K4t;-f9?Dw*s?dZ$C-eh=3yaw2FYdTV~DuioF&N znmOpnZt5mEJs`eFxpM4;ErAjdOB}4LtR$>ax$U3%OUmu0zFgUJ{b)EXJ4*gW4{A5R zc+eV4Y@qv^N&nN89U^%RoHwfaVx-7^mfUir_&Z^Oa=H7Olz!N_mzPyk&mC4N zyZ7tDE#@k8@>RYDTN4St zW8>nHw~4hr6ylvPDy{tV{C>02?yY4%Sfd~Xs9_aY`7$dJ$*j z?7|8g=V?3;!5lXhUt}5aUn^8EBwUm(H1Dn7?o^@fNaslgLVidsJP+Q0hRAjm`jm^; zWuJ?@=-(Gbf6ohwgT}rk$xgmcP#2Kr5=v;v=D`mb5G`p z?8|AcnJE`WL0=* zZ3*gPS=h*#lyBYNh_9xp45>*|ts6eo+jl8;MPDCIlodFn{Q>s48O*zM*e z+Pc)d0gI-344-%*$}ifn(MYimVB)$7qEaglUo?{_l228Y>EeBzIv>BY_W}7`Jgody zQxQoaKJdC3KKm@`zT#b6?rnIZf@=0@sZo72WLmxex8HwTvN#l!56<@)pbq__w zVSKs0nFA>@xY`y9%lw{Kp6GnBk;g7Zbk>%MT#SFbs~v)~-*FTtu2b!zhrYs8$|hf( zGTvJPYhCxSw>0a0IbR0`^xeC>LJw&o-)(8&<`Imf@lEazJI!8X!?piieVcO|hbPGn!EASBEW5s} z1#YCs49fEQlZ_Ir4!v7NXYK?pH{4l)bn%bXIeb#v1oqWYd!m!F_C()2(Gv5}$@)AI zjeEQjI=q2%ASiIK-A6XsVn`}UQCExwKVvZ5Otu2QF@7QEPNqx=3iCn|Mg0brAy^5$ zJ$WLUuO^HZb<@L-nUnYBO~u?ixen~V|KI+v|MTzu;V*ywx6%atTZy#va)0^9fB)-W z|Kq>@ll~?BYnkaOSHsQ!VGvC4>l#q+E9Rbh#+&$v{*If{tg>1(v!qx+A0+ZMeV#*h)kg!AN4%u~^AHZa;$V@kcvFevUjIxcN&z!M& zS?fK3e%WwB7bOO83X3nxM_*>P*q?rp4{}rek1+)wx*-TW0eGm*W~z?e*)A}F3)MM0 zfkfcs`gb`gB_3Gd_#$>vN1hj)Eh?b0?^UvAZMg$b?bn86>Bz zY-U46AcM8@bibGK)FyFm{2}+-312pWQ)x$Z25<@A=%A?-f9^Q$%FNBR<&IZtijw-K z<^mH>TvTXNsY-A`7BH0km6B=8qBG(39HWuRkaDqaz*NYY!E8QIt+f7BWaI3(tlq!% zGi(ND@|~eMZ=6D=fTQfw)te4}N9s>abT=zL92A|Q`Y2}XBd^APQt*LSvwL7}oJ>)|-gxT2WlJp7;lARh0L{>OUM)4NV^@L)4ec3Uj$CKF=N0W4 zXvZtb$IdHB&Kvjfl(@YbW;E8#^hw3WrX4__p(swaU0x-ca+TfCJs1pG^x)xen}e^f zpKq&d!MbzpdK5X2+2@-ua^RDu66Ym^1eUJUsMXGHTjVVX{G7UWH}I`I1Ks^e4QM_X+rp0s{f^BPv&DqZ^e43^VmKZ*}lgm%IVXkb+iRY`2t zF+NafR*kk+U^Igfhd-ZCfvCucsB=LzpTaWb>6sLH8s04gQ{{%RQ&@2bRrMzGd3~5A4-$67YOlI3EdGHmvD|JlmAD`TL3^B~N!@emAPj}i z&>7NGa^O(S+AxO9`G~Np%0pb6H7d`%dXF<|?l(j;AWp>lPCv!lj03n|0X;ZfbGMWK zIB5mRj$MWh8!P8Gw$iy`8=IeCVj1T~x5^(X);XA}1)y|T@7eX^`S8yLCrkDN2wcx@ z2crPbh&YiS%dBi-3ax53)wt0s(%xAIS%b8m2?;CwETm&HJg7!+u3Cn$!vdDDIrJfE zIv3n4C{hLA7bJpgvK@{a(%5k%rBOK4EDvd<-s>F~=r{#mA3Mn`jrwLEtS~;k)t=;5 z)C}AdCqrL;pfAa(b#oIX{j=5xKPHJN^SmJ0e9r0y;1|(SA%XDo1Rwb z_BgLynGW5c+kIdXh5DB*yuU+Exw*lh`~EsOLVNI1+yAO*jSr4`kO9wb8HP8|2xv964HB z3Di34b^cPtqwCpSm8gxW`<2VKJr8H`DLI0E@!|01hIulLW%Hm{_Kz?c|5`eZB^j*f z)d=?}p$APM%dqA8>U)ss+!d-2X7PivqZONgfho(lRJD;8Yjexzx*!wk_q)-C#I`vT zGtSoK-@9d8cF*pPx61|kWI&_c#1CP)6=?^&X#=tkvr_3oega`C)G3i5;$!2W3I&MP z8yyHjr^+&2j`~W=B^6M`v~rki~gpP!Ic-)v*x#26S0YEf2q(~*cS^^ecDCCx~)NL^B|dW)wx zYlLQu)uA(v+64!u-8LweX5MX|hc^~MBJ95m??^~q0)0*CjcAR$jR0NWc5~j$Mjj|q zs*e5RY~SMVW8;}s#X!NV|l%< zNIKp(-!Y8M4c{H>e{7o&PmF;zs91?Bp!NOw(JSeXf|f%H5Q&|FFv~8HylP+AlSs%# zPpLi)7VCewzC)Y|gUM8e`q+UQYTrLe^&%AyEA*=Un`3B}i8x!UF;;GUa_p!kjSu{I z4p<*LZ=aDWYZUu}_GOJlS3q43s-t!YDj`rG*I7gDUQn{UO}em_#EE8g2;N{y5R7D+ z(0AYvwD#IWVm&_=IL;M>6x$x#p+p&|*}Kz*AiIVT)fu=*%}AvzN+Bh6#2idJQd*B{ zO7kj~$xC*zrvd)c1<8DC{2g%*5I*U2K_oWXdBSyr7thOY!s2?|AYg zerRZ{>mxF@${S1%-ZiK*+b0E*S)bAWQhv9WpokL42*$e2*y8DZ{waAkc>37sdtyFM z6+ym^W%a=s?p7A<(633>d^{Oul44q_2{Atc8(ZN}(goi_hUnAE?N?Js4$T`uWO{D=>?J-T6rVo z-jR#k$o57ydMvPZ@>m_aV_tiSMzFGPBzF}F=e=)ui{vIl86jR;XUHq2#UWh6~7ALK(qq~2)UQlCi2s= zr3%lzj-8MnzQMMj8BOzwR_1!#(5yKikpoh7>==h$d`o3==la+IHsFP6L=4SCe8-|Q zKf|6KXXHm=!9Tce03RvAku{hX*a%-!dWcr)N17M(qnKA&Jmy|IoOq!h0KTe`5MLkr z60J&7CtukqnScy9^1z}kH!dCtC3!7Mm6=bmI+o@w0(|glQMS-(W#*qO{a8Ym`18TN ze-z~;we4TuPPpFcM9?Kgg$^G^YgOWlzK^c2RQvuT96i*I0RUGzesrDunNp+6MPVVL zG+a#IO}VTmyyI_}xIIrN!$QIc|HZ?<{`Uuzsag@kS42p)j1)H)ISKjHazlMCe~R`W zNj*~-_4A^s`fF#oLI_Zp%(`5x=Ol(RHkzkid7Z*qm8mP+T(g?*CBZ1{l!n_PPl(f$ zjDIx=+3}7GPv>gk3rnHA;CfURwNk$Wl8+0O4?M-iF5x-UN6&T%{3WYWR8T_DkD?v% z52M`~{q-c5I#sY(CsT1;$&w{3uiya`&xbwuBH*3O{^2*dO<&YFX=Vqibg?N;oDclN zjQw@+R8VR7E#6&Y*ZQ?RpA+k57n_dDtag!mHhQe&aVYN)DQ>llC2Io@fOamZxbWOyhYCA&wy6>y zx~Tc4qG3o+SIg|`lsm5%(QaA1m~3>tCU$EAK52WXI%DERd3WH>ZW3qQD+J1J4ZM^Y zTn2tI-%%iD#a`yMlJAE?zNvd+{$@>|*T%8FeLz1C!B=f6wvP4}f6oS8@mk+_s({LF z##U79_-pZGKhc$wWzL*|ota&*(MMEqg6q|v{UOC&WaMfp&&?H9DqK`}Qq_9M{<0P$ z({qr#MPz6H)kYTkjYbx8N7dxw346N{qN?_8vhD&EwLxbEtluQS{HUJEeziM7ENU*z zX!t=89+Mwu5R~6S3Qw`i(4T$30W8R?Mj-UA~SX>o3*;>sgmy+E=&{+v zXHDe$TeXbKqUW`UXd%PGxX>6wSt1HbL2lNYVKa_VOz%KxnU-i+GVjUeYtoLDh@@Wq zwz%a>i@lQ_TT}RZkq)gDfg%A^C-D61nS9g3TexSUFdbFooANTb=2ko0$17}&1zCeP z+PCUnTy0=$7@)Km`1eMq+8+w0ut7^i$(pO6q z>)|koHtsFb^M>PXSJ0L>`BVuSn?v`)&^pnYTaIKLR14BskjQlf#oEf}ybiTZwG}2c z6{)ZUgm)Vg`R7j>I=FNOE|9u9MOd`TFh=I;aQNyv9>%gGUVd3#Ekt2ivAUi(%oo}) zmU%}9eq~6Jid-!yEn?h849v07Z=9}Ro|H7LBVa6VSB`8M~llL z+gBx{yVPWWmchkwY<(u-MLk$b>vnDGRQ%Fjr%kn>(3^NtL3X_drKgC6#o&EEUGkoI4*P~bs7_)x zGGVy%fhS$$6dt;166R3XMdp06y#wj)Jk^EaJVVe=Fs3J{)MX(opA#q{_(IN>b;v%O zH+*ROxrXv&<#;WQS4+%BSGS9zbl~Q%+?IM`!J|FiZ&EPit z`bfr3CzBZ54t$3)bo+ByQ-*bf*Ly(x=`HUGjdC~0w847cDjC+C;A{N7MZYEZ`*i8U zlo|X5c1y69?W_up4RtyAnZb-&U{;5YHP_y$35Vj#I+7BqU{1k$oY(wwuz}VEKT?po ztsW4-01H6$zkQ?RCvOKgD}JEf>K2A(ZOuq3&h$yeFRZ<5FYca;B1M3W5~FM}u_HGI z>)sAV5MiZs6<}R>m-wdMgREKlIqHlww|#IIQ`PPau&fHIGPjp4Rem!$m79NTw@wmN zk147AnPjUJ%L~@3k%aK1oYAacsocHbjs3>!t@;;y4ls})B$q*FksHc_)U_1@+)9HF z)({bhaoQI;orFgn%!s@n@FobCla#rV`*vO-w))HUS;ZEQi>%lA-4dZT4#1Vdw>T{D8NHWt{OzD0F9D)<&3OA(|;L*y$U~fa}Vx!TQGcq7sX{^LBF18<14+MtNwTd@?~in-P!_UW>D#OtAiat=+p2 zQ>em7zAQ9xWoKxH!Ul#dcUm)H-6mFoN<-vU#?S;+(qT}j^F$6|hjk{aU_Y(G+Y8~Ry;-bS$r25-TMW!>?2}h*El?NqV!(zV9nFu#xLPMCElD$fhX3HJ83AEzc z3I%cvyCMW9UKuA?+x*DL1HFj*H6lDb`0q zX#a5ariy|YcFbHQ?&vo|>++tPE_r%ZMk=p9<;UNaSX=w{Dy00~P$?bI2#X?R45{f} zq!~;G8=OqAe(oyiNZtfVfvp8^Tiojcc{!ORaII_$!Um650{k-YOm$V4qw0=%XJeM# zvyUP3x;N%Kl?a#vrdHE99~)LJZZ^m2;2i?uB?kVKfEd=4-^+#BDWxvtJ(NxHiLTGv zsW&FqtJQ^~-h8`;3wz#|3(v)}GZsl~pcFqV4dr|E*?h4zwaE>YK1JNJ#HB-ZHoBEz zo0C|nBv5<+%SSh>mvX2SzG3;YNPSB`L_Jb&^TmL<0TL|Y$Z!fxWc&&OxBR3)E>MyhQa5n8ly&i;TA)``mjQ+d?;0 zc~*fGpdx{u+BLMR0c->;a#ZRc6YlJIMOY{AP%B7A*aXk`0+@fDcVAmS!X)s%x403Z z(Z3mZd;8QJzJZ=m$(7E0E5ZoRXu|lmIZ_qrMqCcm9&8zZd==h`SR-ypEtyGgGghY^ zPYoBVafM6F?nU0h0<;@(Bz&hXCk7$q80v?cWqPN)%y+fXqP0K2){uxecPo~686LK% zA%*I+9U+^}QyxDGnAR=NE;UmU(5y+<%ave@$%=Fy*GR(5 zt{geK`lrVE=tSrJ10kR)ru}I7N-5GS@@R9qqARUY8Oz>sYlS!ePqSm`!-gMemeDw&altQ-k}^mv z%A`z4RRH{P3V4&68rPjw=rnp`yprLXFKctds}umaIW`yA*lB_f{RWl3YMdU^N&#Gj z2&==_y|8NvUJF!yEYip`Z8Ys*_wQ_nZJS)rU5;rYU!S5GQu#zwJaBvY`k01VW5gEk zD44N|iPHu!piz7U_bkx7MTLqxn#+<69p2=I&Eqw(s3!gIDNiw9rv<)=LydWyC%v`s z=KGjhapvs%l^tki?JIe*HBTTIZaBxo`jmHoifp=V%|<&T{@$FKd#OViREIB64v8zPisUxd zbW%f*cAO=*)|`Y6y@BpZq|n#G(~h?Bb~?cFdHYUvg2hS<3i_%Jzsa97`1I)TN3Jm1 z39eUR-;C<+-7er zCMMW$I?Tw`;$%JOb1(=3Jpf9%cKS@#Nd9~%MpGEHu30@0aSV-kC+1H$x9=PZHNOe% zO}G*KsJ>)ZZBBUDA(jv#Za|c2>TvsoY$V~iK#y8!SyvD|n-hnG8C@YN&3te50pu+O zdF`Y{=nRkEAidj%Pa7TYvwDbk5<{@89uc#~obf@TXG}ST#FFJppcdO!WTKn*rPDkr0+NSBxs!f)(zv)m5bsj@hyP(uDX4;&h_%1&OE)ugVw zuVbf1_manD_pm5~=CsQm1@A_hVM8d=cZe>WmNS~_hl)e^?v5LrXF{kZe7Mh)AjRwU zGtg*3rg#}r@cSp7{uI9>FE1Zww<)duAGQky|1jZzTq+!Iwxv_tp@+zADxzSDe;BqX z?X+bj(dn2>DNX_TvQBbI*A-?_oi&HoUHM&m>t)>8X-1T?GyRL+F0ogiOxBA%S)t`Y z9}9D_tcgWmS8mf3(b8ewo}k=`pgHgQZuIU_nr7fo`68*RvZZ@UKuUZm3|_7ESJ6+} zBL#STdYC=WYX)t7X@DDu*h0xu+&x;*)EFJaU3f>+)n`E-YBm98))LiA1SG^`w5c})! zNwMaBkEN7v&ss4VHf}qu+A!w5xTY@Dhf`jeM|;kxZ_wnm=TAou4v;U*NwwQ zD2E!9Sf*qune3sVlqVa9F7=@_ZOpV2i-(Hl=#7JS-XhC})VDHo>E|9{lhM58=i2(& zjZxSj6J?c0X6w|Rscz*$3UyQp6F&EbXnCh~3sfw$n%}z~!yQUS1r^_y&&X~=;DdY) z)fq!M8Oc6uAOTl)ui1T7L@c`@K`a104fm=?nXq5MJUV5vf>lOjL+Ul_vtN{9;4$Ez zhi_E3ZbQ2*637h8 zp$zRd>mQ=Nr=Cv>2c0~k4gXZ=$T#s)-sswPKvAvdOo)REk+wYag#`*|Yo6@;SRFg4 z5B=cPgJ*0myd#dUNYifa!VwsDEI@=@Nf_k9^8IJ|6@UIG%MKo=w^KRll$ld1vNm0B zf-hz~2IeE7jZp6pxIlu*c3OF>Wu$R$C0LI=&&z`d4m` z`PIf8R2Uddr%1km+1Vl%w?yxV>dKzNV7@{Bh_GE~V>Y*?T>N)+Vtho_$~Y^$$Qv{l zu@FitQg$JGErFX7N?uFzLSG_&V*lSF{bm{|<=q##(M01^UO_DLxQJOpkMhhkQ_V}R zYNlpurruEG$yP74MntT@8`*lLUwlvT_K1*;5x5-@(s0}G(OlhSc5t;k|Iwu3Obb|M zt00;)%nFpxLpC}{52Evf}tKQ0) z&vEom19ROvtla0R2Xp0}{;;KPUF5(s_!$&e4*7qua#|^>c~9+USQjeE2VctKF4`|p zgWT#0v%xOWhiq_a4&js1Vblh;jCR!;V);9g(G_E01LCD$DnLqFnQ{_^a(t+{$L5jq z>C4ulkfpGYOu|WS*r7A>8|JZowu5vV2*z#$3FjtpG9Z#61JT5sRXZw%{&Bx*CYw*p zWO+p<&tYX7=X8yDq~6e%cf#0XQ==lNj@m%eV@y2?CR(DLv$=oXoV0qjKBoy(;C?NJoW2`} z7op*!IkJltcP*!T7GRZ(Hb4^O%04k$XY?Fi9&~Ri$hO)#E{{})pED$uj^WR-rZ;@7 z5n-_(PIX1XTAF_^KlJbZ;V*yww^Hc*Tlqk<_F-US|F{7Ie70GWA$e8Q5wA!U6(k%Y6ax05OH?UMAdm?gVyY#uXt_A^8)q2 z%$(QC(`w#V(q(g0)+Se_CZ2P?soYfxx+9z60;*QB-E&9KV-K!iOEkW!+x$&+g-N=D z5{$M7kHb3j#$cc9k$UciBba1Yxm2+XXsDfVUtNJ0H9hoP9X+EN-0DE2H=6*QPV6*J zl*1NFvEJ*8O+UT-PTPcyF7cXt`o&HhuOq35{(NkBe_!WEF9&Os43j0Ul7p6YQ4%|- z9%v~Hd5|6a5ojMvlK1X&P5VIaxQAvce2x0NwVgXMn4npT8B4zXv+dbTy9+&bPSkB4 zc!41IjQ-J(l)S_DqbzN7C}fiPIeI~_G;D4ce*wvpeD#V>I)d*G&$SO}uQ2&zZ78!z zk_z2!Wjjwq&tfwYg`l`&MW;Z&V!#YN9*dfY>}RGz64=mEplV;1hoQ5jIObCMATEd$ zgj6ab(P|7FynzDb-P>WZ$mQk{HahmQsFHry;j|JQh0pShQhu-lG#g~be z!g93ZADE5m?JhU>1N=CYT*mn64bMFcWL|KIa~_?3Xw~8M?06HRM6b1`O*3LWTfS%$ zPKrRe`sLq;!RqbqjTATiQ6p4PVLfeQH}f_wnsG1{KL&cWKlIo!O8xC0dYNtY*=HJo z7&#jL4_u&X%bRmcV~SNEMx&UG9oO~JZ!m7toi ze3$Z5_6TX_udgvOO*aN2EM_Tc^%7xx>xr$#C{+lYn>HWT_aIcq-TWbj@ ztD||Wt1^&aHre$Rb`*y*#MlMbVX}5l46qMcnokGpalfd3(j6yLNzGeDDn0M8POs`* zK)${6^(MfT?660FbBJWb8I?_MxMr`)%MH~Df9&QGrvAW}5}}>1 znZJRUBM-aQZK_RT`WbRcL3%`2-p5;zIr&L(Ms*J<`1e~97=AxQ6TC?lT#_R!Y ze$0_0dhUjOs0Ztzu;k2E^Nm#XQsPW1LgE{!qVqKIdc&fk60EEy=N-}j>sp_Bpjc(- z=g@T}JETHfmo=^w>SFa$(oUihJH&vVH}om;WZscpTNTx@>k70C0mI>PDl|6sSVf*G z+!yes+X0=Re$*GD{xnF?U(Q|DM6Q1N)YSXVH7$Qp^jj}~kI0&LDl}Mdz%Qp=z5WT; zkj)5qzB1%@?fy^fCR*d4KZiNm13$9a88*3R^&qT^#F(agsu zynWF7;IzBGJ?O22evTCKtaPDzG_FO?u2~FgZrUb)xf%a{haoEgBX^6ncQ;xe>gE0* ztp>f-48<=4y{b8Qcb7xCUW+HuWyA_}rw0!RhClFwT-;q>2al>s1O+{#u+GWk)hjY{sjfjzVwJl6FsIr0TS}2J09W`KG=t zX<_G^k%6~v_pO^#Fi*JMy~)FU^;8eHt8hg0+jJp)fCaA+GbOBE{;j1bZ%yqhWjOQ1 zsK?rb!-xru8A$TQT)|lupOXNtEb;I_heb5OV+uw0&Xc8Fo}dW3kWWQ#v_KIUL;DQ( zDBySorOw*o_VR_->+kSxJ-vckkC%IB=NrWWG_7|VgQm0RY6C5t+w%<+Gd?gnu0qOq z+}I09$&=msjC9`|#dFIYU{_=`wE1g8EQHiQ%2ITOVhsIB_aKwi>FuF)mAtFQ6sC=jPvmgqk~Yr;T<7guWs!9y;egEh@qb%)>0jQf`IF9aOg3eXr%!*;W-V!?FXm! zz|{)C6CD`HR)4cjcnJza?tUfTr5m8vnn0T&q|k(wd|A%xlQo!k^o!6S=k4p+(crr1 z%+jzD4|y|>nHiFi*LxnXTSg$WwVFG;Lw0i%`nkh*85As0Mw&3)89Z4JbJj=+)>N}E z@2LYqdh47ngrp$3Dw&;iJZ~;Fgatvwr&z%_e7Npw`~go)|I3blQpUqOUz3=<7N{&3 zWh}v~52?Ds!bw<;&QA*&PqDv$z9p)VJuCQ!lDcu9p4Z=TLdED}2g3Go31C)fzXl!e z-Em_^9(IZyTtj*0D+wH#&ckDf-fDmB`TkowyoxsTril zzCq*=noqGItR70u;d#cg)6mP5{b0p|i?T*#iNzH@ENj(cV6p_)-u|bt74@TK15ba& z;{bY*)D}|Z^ExnyzFt&rb1BtpjoWex*k3j5ec_(2bCTqs83QdF^)P0Dxk+KRT5|H$ z`l4^1h@faFTP%2)%BYUkgwNQ79eJ{*s;GxyN?pMVq)2@(lqa2JnHk;B-07%Y$qW|b z4&2c;sP)>6RZSbL?{y@#W?!)L5V<<`)|MMg`(PmZ3RbtKugIgx8d7Q;8wj4rh5ACy z0!vl0`EMTpc);z505SEX*Hafl6f#R*E5ad<5~V72xI3}k+EJs`l_xkC!eywJ1;+(;5-btBh5`9_i`iyif+O|jKOFz<{7vY2Z# zw&;05Z%$ENEzLufUVNaXm6H5AG7K9n^3(z5y2pC*J&izl-0&1B!m4x%IAzN@!YZD^ z9a@lNoLwykXhsi6Di~3{S6b_B$~l%D=@wR2NZIDAD=d6hVyY0)utmL;CApI)fzsbQ zYiP?u_|nj(=FxU?#~4x{w9VL-haD>Z@aBhtFw5CQ2XxW`lu>)P>-kstXDav8KEYk) zb#g81A1+}0u>{LS(^=b()hFYzqX{`PyP3C1fp_HkPm~3Q8`SUJe&)H`p=NEzZ?r;y zCu=YMLfQIcV6x(Mqw4iPIe+g)#9I=y#IcVs_$ty!Hif2j4c3x8mvfUBlpc*2%Jul! zh^RFx?idrmN7PSS4#`!O6~ad6MP*#NVlGULN4GcXExArItiuhy<~0 z2_DB#%s|KNp23Nm-BES6L_sDxSQ6=^C>vw^$)2zQj+|-(M8}A}_Uu=m}+`IP#a%d)+x_Q{VMrk-R3VJAA5VcZ9+ajZ0k0n;+!iC@&+*UPUr z5ZC*?5X?yJQ^Oa%BYve~N!tA0tymTbHPi~8O$l}%P0@Hh?Q$ryjcm5ba?lTr^^_ZH z3Y@#rEZEWz4?ESkESQTr#p}E`rJmm72tfR*Y9LrUc3M%Dkfi@w>3)fh=r1(&VXqYn zeQ=VRjOEz1l$EGfc!0FU;J@N~z8aKisb6?;8er>6)@y4(8Y{2M4pFrpA?@IB!1eH8 zNK<*u;e2>EV72z`Q9btwI0aw-oE!6=?51OiV{DSPyoTUh{KCHf!YvRG@C^P&qk1S#Tlml`)OD@RJj16Qnl8DLNgMWDjxCq|)n3-m_(VMo zc4U%exz2q&o7bk=odi$vc^KO~4PY0dsF24Rou%oc){C#nh;AGemi&Ag6r%Irv7Zlq zSK~u_?iNB7%8OF+KXAp;pR_Ss4=65lQ@;dqb>$D;b+h_67iDw@Me#9I#5Exn&Lp7k ze!{iu@a6URD5Kfjajka&?9HRcCw$1-LaK-T5;D@|o8S~_5U8amim0i&=e2mo@cw1(j~L(Ji`k(BiXN-`e#P1lf_uO@HmX&@Bw+Om+Ve>m{^59;k{u-eV97NkPm~P9 z0J1+R;+eGkK#9Jdat zE+ir`-NRnP+rRZWBNn^dzx>1hltJ@9|BwIim%p@?GFhsN96cJ;nxKquiSmkIPBza* z&~Wol##Jytg8Zw&n=IHYaHm3vWi;@Zq{BtM`(Y9nF=6wAHl%xEE+Gk_!5HA7h5Ee0 z9Kb8XjiI^Y)cKYhbsQ{kfkQ7xenh5KF9%y1?lDP++yE%idj997Q`XLaRWgC9eiPzC z9?i=(_^7$6S4_9Cua%)sCfr%M5a+24?htgfs0{ssPJ_Lh0Ro6yGCGbr+y>%IO+=Q- z*xY1K)geS`1|^=O6j7-$Hdjj5LPuukA2Huw^FqDLZqW;AhxJ30`X{Gl$)Qtzm)J1O z#_HVgTkm+EdLRBL$)5s~>fg%#{Dny(W&A;ft`r_&vW=dxkw8LTl%Cm# z_V`K25)FV0AzR21++nTSVJT^osd|^M?Co1bXHL*H@-f73%B}Ew{&Az_^#mP;4YmFfPzLQN3fHj;H-5A9ujT z(GWS!mq|l+OJ(2`lxF=!(mFf7%B2m{y((Sbt3EzeQ6+Q--Dm)VYyo z$F$ZM015PpCbi3@Dio-iV`)OtQkj>6kdH>ZgTfv7E%^9tH^{MG2SOz~iYeY# zDo!gbT1xnU)XV@SE{0zZ}U1@PU(DgW%dD@FS66Fm#NW*{CS2)zSRz1 zZ?^Ikb`h(An$HttRRJzT+@_37eb+BMc_Tl*vX(3$IG8uMfQ|GL#)lZndmd$&_cXrP zHO469)+vPdDf;S0^U5m7Zb8i*c1&M@klQ&)?rOnaS^25C^Lh5`ITun&;D=#l&jKU2 zk^U;;#P#Q$k5f6ktfTU%_NQzQ+@Jo3x~Y)cK!a#gxBobk`1%WJ9a*#bjGu{C3YN{$ z+4KiTRxX1g(fPWF|Ekn2`P-UVi(VG_jV%5OvV38kMLQbL-X99`6q;5c4GkKD#(Nl{b`?3QS=ijgG;24HeEmB%_ln9sc{;LI^;HVU%`iH4M*?D+6mp9>(v7i zu$yvpeWUwqg=O~@1}_F&lDH2`R63yHC_Z zlr>v*gFFOI^iW|~v@>Z&*dJM^027yR4q| zQU{+&_t2)BvS-)S!-?mfI}AU@71X?o)dq;Qxj2QR_~D?x6l%^tg(ZHf-((U_hiW&n zp&vc#R{ur*x$hA{-8Typqdmu^@a3Zwz7($9Zw|%i_>gjEL*Fkl?y#dXfg$v%i#5y- ziL6ZDf?mQB@$?NhXoQWiPTndIF z!Y+>p(#A{Lc*l7mK`lQrR7HoKmbkJ6I+PUUv03K3>qFjgsFHN6F9YYBl7XZeNX2Hx zx%%~dx3rcwpotP~#!e)Jw%F>)_ZobZZ?gGQ^FV75r@8{R?12ZYOV;e>@(zI5KuP&K zlytRF+$FyvM57wWZlL*pVEBlU&hEs)J8R!x)~u#Dn(E-5-FGyOR2pLQWvE(zFaWU8 z{6hMufy9O^7@2DMYJcQS)_V*tHbduV{4$bWua!*LKmdb2t&)Eig>QD_Zp@p@BU__? zUR#zh(&~%ew84QxCECV*hu)N-UtZboXaV`a)Sm|%06Z#Em9fY?L`Gj-;Icr9lQ^pW z;{HDOO!gD-3YqxyZ#h~&Rf4WgnT`F#GXO&@3V!B?DDR+`gJS;`5V`~w4+7r~f!iBT zRu&~Idj7y5-ksEiJ0~vQlFhHM* zOEBO=&g9*1J7I&Th(@i--u?_ZcZ3UuS?yJV;R-^*_nS_GW={JFCGW_@$G~0S%sY4j zln>G`BgXrlTJXxG=KiEvZ|02gF@dyBQxC?qQbLz9Gx0RTUMQ?FF3ZQAf*1Xy^h5k= zi+1%YP~YAU79T;j&|ZF?aik9TOsk-%S3?M4*Az=5L=@k8B8 zw$A?zX5qAxrWFg4Fpu3hYOI+G*+})_}S~es=p817(_9BN4O|~-yVbMp<KiSK%a^rjr?@p9^6BNmmec2q^|Re$fQ(6X zCW_d99ax8V<*p_gAMM{JXn(t500wdwf%D2QlZzVvJz2hW>hG|rNe@AJGy>l1Sx<2P zDWQyyGv9?qCiMepDZ=0 zKVWdTDM9S?b%GlsP~KU&f^p*Sg{MJMc<64F72Lw`Q7six_2cJmp{GU&7w}xoyXHkz zz|4aC@o*pWIJk+fqL0ajyyOq2Gwh1qXhLj%!I*_vp=#tXlAcpE?N*d|D>1E~}3?+K1%p#8NJa^^f|4 zd1YZk=>3{n?1CB+U`GQ+1)RHu6?S|~__!d$ef|gG{{A~+ydvwU(oSD7`Ey|x8AFd% zJC~^?BZEHa4+OZi5)ihO3v^9vgXsV_RRL7L?pXzhp}PJ;g#O`O{B!(Njo{|>39m|w zu_`&$7l89XMYSm`G>JZ?(sUrh?8RK*UpaDVex#BlWi&M=d6A(62Zq-17)n!=87*ia zb1%H%>FdU^s@8QU?PXSBs#quL|0t z-Y00H$t^FbK%l`ON>;_SF)ayOU2O@phJbo31|P_VAXOl-uP!jrDN~P+(mKh;ICGBr z-!N(`%1pB3RVW9lWACeh1=>J`p*Hrqaq$w4KmJ+|MPWIZzX{1|aQI?JZKWoAq*{%hQ)m+_J788-y4#bKZbvEbYU9-%2gCWaL)up%D^9=Npiy>(e`b9Ki1qTgrU z0Mj0C;MzKI!mKDdZ@~qgDpX%m+FUj|124Va zE_eB-?hs+e;hrRG?Q{i0xRq=b!bD&<7Y?sXE+`teu0$xFn-Ifj^rwmf7?tX0p`R?x z)yfl=;YF7-fxAY*j9qxKwwv!%{>VRrgP~1oW2%~z3DVtfT+X$0b~VL{-u!)E`PODz zSZK!||2g#qSoggEw=>V*MhyPT{~K<3|EA zVM`RAs9#y)hWsApgN9{@3;RQf>?&GBh*K$SaETu()SAXsr^WeQ7%F^Ch&uw4vf0%^ zrYW{BurBhA{Bq;6Ui9ZlGe_qiGIoxug>x#xezS1F|KHoUwOq3s>HU?!zA|`kq$)|J zy3Kfo1e`czl8X>R7#I@$*ijxLt0XjYnMcY)jHL`F z!C7_WT*>80Nrm(fYhHb{Nxt$KjEkNeUJS25@d^B?*cMUMf z=&dXuiApM?wC{hAn@*rdyOp$~lMg zYPbAA8x8obfK(~)yydMjq4obTuy#3hrqnfOz;-(|HQx))%-_nA0q4VS=KR^VYT;bK}@^!|# zfzZLu6Mk!^?wFD&FtB}#Z`iQC3sxh)gXU6o+U{dnH~cKeq4p8gsJRI7B_b422 zXGC2%kOMePQo>Iy z@TB0E`tWeGEA5kR4)ql_meZVihjYSj?UF$!Fhu&YrL=amFRJDck=uLI^v6n2%+wrz z@@!gZza(_nTw#s8^Qo9IgVyzJ<*5c~m?WGJkA(1SfE>o_YLHZNWs5=9a9s)57X^D% zX)f#jlB4Ph8!N1Q?%t-G!WsmC(Oa)rcEw@^T|-J}?epDBN#yT3|G1ggYt`p2u?Zj1 z<-x4`?q-=qQZt)x5)ar24iSH(Mn-G#_@@1#IEt^>WY{eEbpe2*u%J{(I6!#xk#g)r z70LS1mrx3uid*W1aEj66 za-4N8fHJJ|Y_|3|g3$I|DK2DxAEk#-nxnQQvcqP#TKS`ok*j~ajq`7w@fq74$Uc>R z1#zX)M`?#PC;4I@x}^b%;~N(!pQ4G1(w22pIK_F-JCbYodZ!YSCX#TzumdHADu0G> zeoOSxC1Td;eO3^d(np#V{I!_x2ztg?;A=!Cd_wU@eORJvJTNNr5L87r_mGU50wpm2iP6j9&U2z33qsX7DiTQCEHkjj@Xx5#+wP5V< zG$=1vPOVh~zV^%OV*Z?FOnJvLA(k&ukDRrbdykkrYA|oYk0{S%LO#Hmp}aAtK*O~D z%`7NKjwO{i#e3g8WkIrl;6IK(l z9|UgMZKNz-UQoA8WVZl4A*vN@(b@8Sfi+v3_#)vc+Qs!tAGzp&1vtrp1rjpsUox2!r> z)tw9@a8l-EKZ{ij>~-j@LhFA6l6)1Dya~wi1hLkRx@cneE$`etTVC&whBcO;Bzs${ z)TN=izy_`&L0^2#IH?aw&TWMuE+5_lcJXSq*7j9>6k`oW%D5(AqBj_}GFFWY>O+ER zIX`&B;|5Dg74|;ksN~~*ljKBo=MqqePQOg~HnQF&&5qGa#3!5N@yQt5f5m!l!7@AVj4s8oJYk;&F3P{z4|a*ktH%eTI3+<_S#W$60b#Iw@Z$POZNwYdM|y6C#F?gpEKil9 zdyX?V3S_FIOKT+0cW@bBSVZcb`wAMWEFmpQ<%9MADo5A>K<6}wPkI)9c2qwh4)a#o z$Ex9GS^Bor8|kpi##b~ zQOqJL$}qXHyUXb#^_UQLy%Ti0TPTEPa4w0s|4~~tn>6=8QUI-pHOHK0S~tWx>tA&P z_zGL75w1802~k!$FKGqK4@(qMztKFe+N~--d?RC~Wm`aIMISfNIxm&kU+S*Oh9K9< zBKfnO-%JlyaOfGTCnn|Q>IaGl^_!SXWAx_lX&qxKSdU`~Q@`1I6sbjE?$a(6)Rn*PCkBt{Wz8}#U+Nb)6`wu4Cc3aX$ zpKYD4>?(=lj|jUtpPL5*gD@ZKz$g!F8o$2`rP%Cmc^XBfTv6mQ4^`r|nr6Mx98-1d z@2r@e`LiRQ@7ky;sJMN=Ya;NWUoXF}sMX2x)vZN*;nx!~F8zA)PES|jQ0`;4r+T_x ziw}k8C=;Z*exAXBydsqk1qZ6@g)^4#;}{v9X>or@Zl1L#yec>nyMh{nXgmT61l1Lm zl3e!(T)jv>nK8tDcB;fSt{-@?{ntj8MfuzY3da{Xx=qK8_u)~z~lA=S7_v6tO4 zUw+!AgiDL}k=Tpff)V7}bcU@pdg-PI&ECN7IouBWN7*^-XX2o`6aBF$ZrOU85+6*L z*n9|Uvd)6S;yGK7H-Ei|%d{yt3M}gBYCLc{{n64p7q#k1F-zm#quJ)W$}B(Mid03~ z{k)3(DkjH}g74qp4hc69cI^g+$-vLZHI0Dbx>Sye^t6wRrhf?mdK?SGefHxWcrhK6L{9@d{(o8t;_j_ zNy1qMJsy8QceUlTZp(Oi?^NP3BQ!#&caC(O07hqcJj60!JjTAF#@0QZBy1i`c|fDQ zla(c3C?YHScjZUQX{eVe5od7?psE7T>C@0EPS>nFkPm2Dm(E*xOO~lVDy9e5XPWZu zYOtilSNXfTcY)&^d#Kdouk;cx>Mt_zxH))-Ea!snN7>rycV;|3m{z|oz-3GyaS)Q3 zx65IXNlS|FVU+i!wqXd=DP}VF*Nc|%*(W=%VQ)X`C6ObF%`2UXsuw@isOFUn~qzb zO{Y|sdf(mgAqgOlhpM$K`wZ3fS8f17g+i>%<%|62Yc2Qc8uQ#-lgl*_=qqmsLXOoV zTwr=6j#(&p$p5z)i1`L?pARr2koG* zRE4aXtbRwRfQ-7^KG4QO*|DU3_yJAYyW-OOq4tSfe&T(oe%l568qAOr5+7u9s*Ot0KAY1Fo2- z)(D)tm$Q}>#}sp@&baTD^_EqZ+=(Z{H6(%p(94HgrYixwiT1rNveW04b>HP~kH#5V zvf~LUT>p%dOjKH{E#MK#;Zl1Sl99GNd(Dt#Vyn5x+ zwRgNioSt{=qBE~A#j?X|oNUh=QgSm=DB$vk#*rjxrWM7Y|dU0`v^q9*CUt+#j8{WBx zzLLp~RCkNKiwiS#%7^kw@R9o>K^&(;Dh5?8KyhJ?ExBpE=sfNU>;_w4^A^(-rsSh8 zMdcN6owKDO&MqBF9uBL;Fin8R0Nxz4e4v5^_PGdy=`U;^b2J!bHk9C!6b$w{_P%2U zK>JcQJOQBmSj7`rMViUi?`LMi@^t8z782vn-fXNbD{o=tGA!rv9_)pv{T{S~%ZLtB zH%Dm$OlN*&&2mn6_4hF)Y!()p$cf=ao;^{Y7)soRddb5#aIFc>uy4O?AUiL6#GsS z^?4n;hl+~{p?T;HLelV4yWjdmb;pECC6*>2Hpr2x03e^*LE|Mamon<>Jie%k`Gs(g zmZ(R)ZY|8&C_}E60)CQYB$tDyvxsDc=?MQ?Az0JEec=&z}U8J+qP}nwr$(aiEZ0XZfx7x zF}wN~edzqh5Mz+dytMnUqQe8rHIcbcG=8OepRbFk390klSsHXJ`s_{Sm#ZQ$1LL0% z8m^A@4x}Kv;fyapRvKo@U`idl9bRK>&-IT~Q{Dd{UCuFQns=s%r>r>Q zDfff7DK4Sso4Efb#MakJcLh@Oa?Hqk%FGE^yx%D_0YUe0vRcat<|g@I!5c1!?^0(0 z555)iDcrLGsuHFXJ3uCrxO$X(JIWs-mLa{WS%nh`og;w8)7oiqyT|}6$#k$rP=c{X z7fxQ#KnF3Xn3%^BO5}d$E=7?YtVC$dW>m!d6`UXJsMBy|@ zyB7qav3HZ6?n*>%gjNo7AoGzF!{d;lBPIQOO2V@@8kgyatgYiC=r)A)$V!t#MM2Gv zTNJ5sxh2?8Yi~dLJF}+-g=utYGk^0s-7XW%P^W#s9Ye4w9k<`m?|Re-)wf6PvWh=0_EYTP3x)_QCT@#2 zE69aMs#9$oB_hz1orRaq$=N|QvGM`}<+cp#K61c1^=+eQ?ieu-b-s;djJVj{kIg}7 z!8xEdOB52)z9kZj`UYmLme_|n4$M*UtUD;Ru#Md4zx}mpc^W} zdSgQf6y1pS`7xZxDqbrDq@NxI=pndJm^C~*kgUoX%Hk`3`ImMrs_YVrKbBAjX?`VA zq+8DPlv~WT_YA_04y|+~AlZ`It^{f^IBV=%vA_jcwJ+ad&#d>pLV=)jk0*jS7quMf zdx_5lc%2~SZ`&=<_|#6TSOH$_5Y%hk{@tbmu|3(o!jnH7REX6o%VQkRSbfW1eAH-T48-gVel+b~|U%g)Qi-l5miGTvt~ zWcy&%Cffb5p&&3Td-l;Hwh3?zntye>CNn2mu^_t%?0081 z1fd9B7uD2FXZ)hF@lgBn;1kdrUXD6dGPNzrk1^w z6^ZCe&zcNj<0m^4z}(GA*39mn(%>CS0AN=kO=k{O%TTDan*GM)eOk!h=RFK%vy;sD zM!fv`Z3nHL7o?O!Cgd1fUDuX)oAlX;lP|zH`4%Usr4ue3gd4F30PVZhK578m9JC1( z_0gT+ita{a!9+>8_B?C=YXxPo?tf1j0EGoE{GWeZSIi;{P0H}IoSd!W5N;gjGP#7cyRGHWE`ACMPV+3w5wME-@E0G-X2 z>SzD=D2WD)xPCp=f`R%6c4xgk==URtFDSi#6mpi8V7VE3j4FB$*2A& zEw_0jm5*NL_Md15F}>A$O7Q70*df|iD+&D)qUYfeZ9a~aC{qXH5_!p!Wq;!C6-OkG zQi<(5r;?1hdGW~BMpyrZxGlQcP0@U|W9z>pok`4Do~=ZieOl!MkC`V(8$%&Q-k9%h zD_GE5DZ~m@1d&*u1hemSE{YqrLUV;emO!25P=zCLLsxsP;`>`%6-df3zhLfFE9Y?T z@a(IXmY1L2;%rYz37a;;Q*J}4y-)&biYbbyAVjw2P(sNq*r)KZiW}V34(jS-g%nYhij5jSvy+b2x+IC;E@LT%Hr~aX% zBE3s5*dZ>cc9B1<$~pBkGP8>X@Kl~FL!cAmO~dKA$GnR)vM@TU4AL5<-iWDJkJE|~ zc-`U3j3m@(fW+(J(S|Z`zhd)JL-Q1|0l6G}K60+aIouZBwKBCY6Yh3a!hk0V<_mhY zYB!{0A=QX-#+92XuWQkpN;_AvVUog2Q#0#YQHB4 zsA~phUV2}4h4`QBB_`naP4L2`1{B$E?>HUM?x)5qmiZXXvRJF$`r=<_iUs>hq{%ih zwU*z8H8r3BiPOQ+km2YIcwAaz>8*o`4V-dMs@tOK3g0ZR$=5w`8a&IALsx@XJYS0e z@n#Xurp_i@pzHmWU?NBP4Om2c^^}7~#iJ2?;zw$X)%Cv$gK>hAQW#FPmbRH!Y`B1X zd+rlrG+)K3`M?u{zMd=eu96RwsU*>=GdHuC`F@&~*TC@fB}g;RET@qOJw_<|C{%5> z6Hac`r@mSz$+dGAL{zCh09&C)keno@O`?w9qI5Az*s?^`qF{0TK;=iVHrd=RZc8Q+ zg~5W1)>iYAt_2Gmu_w(CPJaZMnd>Hrbr>#`=d8Xpx43J>c*%$U8)?!oi8P5D^v8IP;~~eO(tsKsC|vX)TlB0^x}JbOm(#<@ryBy=3>Y-9q)At zPIsNyERYkI=RG@T*lI-K`Vx(p*Q^tTLro;t4GNr!@KO0S*e4ledKLGs;E6ZZW`%B+ zkRHx5r$Qk<&9G-ub4c}4PCl*9J5f_W*dB(~G4&X7t1VW<^2pnU$J+p#H^$!Db1%tR zgLjUkp{2E%{&C%#*w8y&=S5e?d-3}6(gOKM;|8ZFi!vwQhxYK`wh7v+e(O0yfaO_o z3VNp#INP~Y22!G$fhlPP&S94C7q2HxV6>Bs;1U~tJmvbM-seos|lqV}&*xV~o zX>OqPgWW`6BHD{oAuSyS21e~s?X%qPE!H=+v&q@d@{quKM-dOmZ)vgN*{^{)4hLxt z^YktYid*CLD>|}(&lkinU#s>LvZd_sedS*)t?kaYJcID#Cf~aQB9WgHSKb|r*-Pq% z?w!{`yw%&mN?}#fglh_@;{66y54swcZhH5pi2UbVED}-CQ0O)R0K#c=%af(tPv+Hj z5lR*q@%h4V(>+h$vg2fvXCX&|w*E;x$!2mK)Nb@5k|r|vH>VQp>#uKIta?CBB1i%a z?ZexoFw0AY+NyN#jvzpA40HfLOLJyB=PC}1okZeFyc@Q&4SJN5Rh?B(PL$bC$ASt6 zVyBIEJ#gdQ(RmCVSD>g~*`?AN7h3IRtv{N4ZoJ8)nxArn(xt(Chw12$5w(_k;!+4m&Lf6q+9S!-y-<2Nj zzV>LiY)^89cZi1K`=A_HiHWp7SLhhrVxPn3tV9!5xU;Dp>RF~)DFK$lJ9mF?jwGR$ z4~#7n5kDt=y#hx71S`nOVT`@1zn{DHh5S|W7(AdlseI0z3nh~wCxOWt0Q;eWGqx!+ z$N_RXT0-w#6MB418a)msZD~w@LfcFJ;M5&ZJ^0*m;grTj3D(y8a~}F4$US0t`CwFG znCzu#b6=5?DaAVn3QX#D{_AkNOlXJx-1xaM@B4bhn)HD=UZyTlE6D$RY!0^=R9XaRKnSM-l7hB4^ zfjMasPQHR(OU9^-Ase>BhPJ|3Eq#teULdB_zmS$cQ)gkpfvrExQL2MV~~V0E>(w>Nrrk_EIkX`D9@|!(P?vNV(@b$cMK)%Elx^ z*QRXeoX~tK*vyo5p+@`z*Yx}~-?ij}0-Af-#Pzm#%_bsL=-kJP-sd$C5>c=nY%x{P z=SQwT4@jJ!hoxj+G<;m>cRfP<_4F}w4c%@Db6E(Y^;c|%Zzp;Youxd9!;fDDvlH^J`csk!?2jE$mCZlNIQUS&4G%i~Dm@Tr=+peMx$g^3s%n z9(!7n&&Io?tOwik06@;%@^W%tuKz^3vcx27=Lxvnmz?=(?(NO;2O4=j7yi=v-1;DI z`BI9QdkRc2CzGYjOtSyw#~De}1_Z}tfD)FR+DADJ3eW2__QIc!*O0NGmKzeLYH!|*KE&{e-ek4)RJi?mB^kIMh9~5qYkrBe(zGWVf?hFs>i3QUT6X`5A;$_Qp z6m9=|TE#-y0i39g1S*1RQ%^v`P$_*rlMXI-0@aPmr%M9n4oxCv2Z zMBI$)4{31tcej%giivn+qH(E41p@j{J2D4T#8%t*Z?9{QvshxZ`j245`R4_5-X(Yb zksn391OHTDK}T4uvCS31acj_B+ zs>=I6Y8SAWjplfc_!Ps6L$|rtlN>W*hHW}d!^r!g;wE4G^`_7&a^2pTvp*!iEAbXn zJk%xf4SWoGo7;-c*UR3oTTK@!W(Kx5)2Q2XEl>foiY5yuCvj5YSF%czmR4hf?W4*E zT#YvfW>Ou+mPB0n=CK%Ei^VQ$Md+=Y9PXSdDK1J4nVvh!G9`48W;l+DZpV078TY-ya6E|2d7(w*AhNDs&+*c z8-6vg?v1yiPvyYgkt^Udh#tR3vntP*pW1qFQog~);wke!?E1En%q_S0mI~;K>&2v9 ziBUsfTw<8(eg1`V1>kzh4H?A+fn=BjmbI(0q*<_jZ}Yf%s-WLqqw=>TzYxc7%WKTq|XoSu?W868#ysMhIj zHnZN^$1*7#A1bZZvxm}M-T6ldDc(CIn{>v#3UcoX1-LW}_2A9}hqgv9yX z-3re@Nu$O_`5>DSLFx6S&pN%ov~SYl`H?03y4o}NLV~%g7{2wGIh(mF+tr{n*{WAB6^&BfzZga;G=`g zX~`jz#sivO2c32{^UBfslZ>5z5ih;1N;)kDj2jn>_o7$WQsfSl#zFb4P`k z^{u(Xl7FzY=CQ39=P&({c4XJGh-lHZ5br!TvcudHGMThPmT=SG?Si?AcG4`AtS7_I zte)*=@Ylid&{(z#5aABx4Z^|fs0>439v-RYEm2$lO_#7MFFVOQQRH#zw*ITr!|yYd z&+l5Nl+%=`Vv*MffQ7~!G*Sm@2!Zk|7s1QRY5FOq>p-Zv-ao_orJ@)--x>W+tpT&~ z@lO6-S;>Dmd_Q>_WzCUaF#m>xWG9G*GLHpk(<&~IFAvyo0bgRMQ*$fswu(o`aN<+) zZN;e$pMF~vIaqDXc5b~BlCzA-5ky2~{mZ5^?nfovOa(|+sg7if@uiv3IzG0f8;8bm z*$n;ynnP^23PHwq$+}9jNSpW5y4J)SykAZS&R&TIXb!bAUpyWpCxj=U z=PWw%(xg75*^rr?T2&=4YNu5Gn`*zj6g2ApDM{ohu9*O}!bO|&R}!|dbqcn(p*t?C zRzeL043Vg{LcBp1+FP;IDyn2$cH^Zw=(6`urAt{?Y@UF)7wxAx*pfDeS}2q!^1%Lk z_S;Zt{=01?=bwg_W4jdM?=4zHxRR#ulkAau?!3h3?p(r@W}8AHKxDUC@GYRZZV_9+ zJ|@e_NTegAC(ia%_a4+~!@Yu@;`}U%rl2R1u4rvzWW__$t_pM?afi#(+OnYN25Kl7 z+NuCrN%O4!mjs7vAc^Z;+m%W*dP;wOv}Jg3`EPiwA$9HM(H8>V;h<`*cNL#i1t_vO zkac-h7~C3xz^2wmjaqSyN*WIH_5Zu)~KPem!?@PZ|EOi{b_6gYlgi|x*==%3S=FK0HEJ8KTSMJQlnT% z9RF2qW&Rnr zN?XLv`J!nB`{xOL-VgqnjH~Is_c3--UgLY>NbdRCILg@eJG{?lNx#E8uAmT7ZofN$MB0i-}47o0z3w=NxG{31$maNm^KHc@P z%vFjJR3wP$=TC`+?P_uAQ@gSy`{sHS<=eAzNIp2S-i>7yvR=a!uuYVvpOC5YKT2KI z#bETIbQh(o*d-WUELdM5e2SPoZDrN8=P`~CJB@&+P5sA`xUNY(V^K-6PI{i#)Ps!L z^sWswmsLj64cV9G6NEW`f`&Y$lOM7IBW_0r99_l`FCS)K$a&rIG&bfTJtYkd?aYT- zU@_!`^28i{?a>7_aFI0%{H7umEo55g$4_NtQ!?CJy>1|s-gB1ezE!jAn9ppmh$=GF zE~liBRd@2M#`!d|vZm*Cdk&?ro$vo%+FddyVq8NdhPfLdPIKnuhKA%m915w!`vg2p zVWIMR+QI6kdOLtkW9QH@Wtb+>X9|ZUtte64GNNoj5AYFsDD*eoV4a^yv7o}~X)NxN zInXp5$kOx%1|rYt3(|<4Op)PWh00}4)=Noe^_oTF#Gyds1~^rO8>TEaMi*@NR||C8 zQs#KIS5G|T7Ia1uuXmPK8r)Szdd~vpXtU7nY?3ZhcKz1!&zesZ`B!p|@=DYJrn6eF zDTJNtY z^y*QrTN&i{YV!ZOm43=wkLhR0o9ZS!b6U$BS})da^|lUaU7Lh!2Rht?F;@m3Q{8 zc22Q6<%xZ%x283q-vhf`UO8Ly(F`;fn)$tw;vER5&8p@Ii_6_{gG1%ja$(}X_q3*lC*{^CZraZl$lm1;9nE_jq(k97k|B56o^~>e03=f14HjU&tcE-}^T?+=L@MJ6IZc!I5#=#lnREdk_rH;1 zr-7dh8Ttgas<NQEk}VAB_Wv)v@u%3oX?7jC?|smf&N^j7@}V?dhUTKtz) z{dKeObix=7C-zpm!x1J@eo8HJHy1GcXUlAU+;7@O6KGG-K3W;<9UV|28TgIFtT5BTZd@Bn~>sy^x zX$s`!8mbr^S^HW(w#-_P+@k8y(~Y40(8Zv+7Fi%(Gb9>7B6FNu$(I>+Q!k#r5;ypz zijn?RvU9Ro^lHs>YCdF}JoSIl1Sf>QPv?R^_bh^ceLE_OAArD*ih-ZohQHT_!@#3I zo@%M=8dXXT#iyx6`$0?|rIG-Yqhlm@eGf-B4;BTrBjBbpDYLwo(V7B_;wh0z2¬ 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

+B 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

8(jt*dUw-ZSs;h8pO<) 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�VqLBT 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 List All Devices`. +3. Select only `Refleks Lite DFU (1209:E667)`. +4. Select `WinUSB` as the target driver and click `Install Driver`. + +Do not replace the drivers of the XInput (`1209:E668`), DInput (`1209:E669`), +ST-Link, or any other USB device. The Zadig operation is required only once per +Windows computer unless the driver is later removed. `dfu-util` must also be +installed and available in `PATH`. + +If an update is interrupted, hold `START` during reset to re-enter DFU. This +simple bootloader does not provide atomic or power-fail-safe updates; do not +remove power while an update is in progress. + +## Debugging with VS Code + +The Run and Debug list contains: + +- `STM32: Debug Arcade Stick (ST-Link)`: DInput App2 +- `STM32: Debug Arcade Stick XInput (ST-Link)`: XInput App1 +- `STM32: Debug Arcade Stick Bootloader (ST-Link)`: bootloader + +The applications no longer begin at the start of flash. The bootloader must +already be programmed before debugging App1 or App2. While debugging the +bootloader, hold `START` to prevent it from jumping immediately to an app and +to keep execution in `main()`. + +Place XInput breakpoints in `XInput_AppProcess()` in +`Core/Src/xinput_app.c`. Place DInput breakpoints in `DInput_AppProcess()` in +`Core/Src/dinput_app.c`. + +## CubeMX code generation + +The main CubeMX project file is: + +```text +arcadestick_software/arcadestick.ioc +``` + +The custom DInput, XInput, and DFU classes are stored in project-owned source +files. The root `CMakeLists.txt` replaces CubeMX's single-interface HID +application source list with the custom composite DInput sources. No +post-generation repair script is required. + +## Important source files + +| File | Purpose | +| --- | --- | +| `Core/Src/bootloader_main.c` | Boot selection, app validation, and jump | +| `Core/Src/main.c` | Shared app startup and switch reset control | +| `Core/Src/xinput_app.c` | XInput button/report mapping | +| `Core/Src/dinput_app.c` | DInput button/report mapping | +| `USB_DEVICE/App/usbd_xinput.c` | Composite XInput USB class and rumble OUT handling | +| `USB_DEVICE/App/usbd_dinput.c` | Composite DInput USB class | +| `USB_DEVICE/App/usbd_dfu_bootloader.c` | DFU state machine and flash programming | +| `STM32F103xx_FLASH.ld` | Parameterized flash/RAM linker layout | +| `CMakeLists.txt` | Bootloader, App1, App2, and package targets | +| `tools/package_firmware.ps1` | Creates the combined 128 KB firmware package | + +## Known limitations + +- Do not distribute products with these PID values until they are formally + assigned by pid.codes. +- Xbox console authentication/security is not implemented. +- The Setup and Raw HID interfaces are compatibility stubs; the original + device configuration protocol is not implemented. +- The XInput application does not expose Microsoft OS or compatible-ID + descriptors. +- DFU has no redundant image or rollback protection against power loss. +- Do not confuse the switch signal names with the observed LOW pins: on the + current board, XInput is `PA4 LOW` and DInput is `PA5 LOW`. + +## Licensing + +- Project-authored firmware: MIT License +- Hardware design sources: CERN-OHL-P-2.0 +- STM32 HAL, CMSIS, and other third-party components: their respective + upstream licenses + +See the root `LICENSE` file and the component-specific license files for the +complete terms. diff --git a/arcadestick_software/.clangd b/arcadestick_software/.clangd new file mode 100644 index 0000000..0aab823 --- /dev/null +++ b/arcadestick_software/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + CompilationDatabase: build/Debug diff --git a/arcadestick_software/.gitignore b/arcadestick_software/.gitignore new file mode 100644 index 0000000..50dbd84 --- /dev/null +++ b/arcadestick_software/.gitignore @@ -0,0 +1,9 @@ +/build/ +/Debug/ +/.metadata/ +/.project +/.cproject +/debug.log +/*.launch +/mx.scratch/ +!.settings diff --git a/arcadestick_software/.mxproject b/arcadestick_software/.mxproject new file mode 100644 index 0000000..f77570a --- /dev/null +++ b/arcadestick_software/.mxproject @@ -0,0 +1,40 @@ +[PreviousLibFiles] +LibFiles=Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_pcd.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_pcd_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_usb.h;Drivers\STM32F1xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_def.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_rcc.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_rcc_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_bus.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_rcc.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_system.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_utils.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_gpio.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_gpio_ex.h;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_gpio.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_dma_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_dma.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_dma.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_cortex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_cortex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_pwr.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_pwr.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_flash.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_flash_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_exti.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_exti.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_core.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Inc\usbd_hid.h;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_ll_usb.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Src\usbd_hid.c;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_pcd.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_pcd_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_usb.h;Drivers\STM32F1xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_def.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_rcc.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_rcc_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_bus.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_rcc.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_system.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_utils.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_gpio.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_gpio_ex.h;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_gpio.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_dma_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_dma.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_dma.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_cortex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_cortex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_pwr.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_pwr.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_flash.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_flash_ex.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_hal_exti.h;Drivers\STM32F1xx_HAL_Driver\Inc\stm32f1xx_ll_exti.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_core.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h;Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Inc\usbd_hid.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f103xb.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\system_stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Include\system_stm32f1xx.h;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; + +[PreviousUsedCubeIDEFiles] +SourceFiles=Core\Src\main.c;USB_DEVICE\App\usb_device.c;USB_DEVICE\Target\usbd_conf.c;USB_DEVICE\App\usbd_desc.c;Core\Src\stm32f1xx_it.c;Core\Src\stm32f1xx_hal_msp.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_ll_usb.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Src\usbd_hid.c;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Core\Src\system_stm32f1xx.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_ll_usb.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Src\usbd_hid.c;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Core\Src\system_stm32f1xx.c;;;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Src\usbd_hid.c; +HeaderPath=Drivers\STM32F1xx_HAL_Driver\Inc;Drivers\STM32F1xx_HAL_Driver\Inc\Legacy;Middlewares\ST\STM32_USB_Device_Library\Core\Inc;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Inc;Drivers\CMSIS\Device\ST\STM32F1xx\Include;Drivers\CMSIS\Include;USB_DEVICE\App;USB_DEVICE\Target;Core\Inc; +CDefines=USE_HAL_DRIVER;STM32F103xB;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousUsedCMakes] +SourceFiles=Core\Src\main.c;USB_DEVICE\App\usb_device.c;USB_DEVICE\Target\usbd_conf.c;USB_DEVICE\App\usbd_desc.c;Core\Src\stm32f1xx_it.c;Core\Src\stm32f1xx_hal_msp.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_ll_usb.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Src\usbd_hid.c;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Core\Src\system_stm32f1xx.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pcd_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_ll_usb.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_flash_ex.c;Drivers\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_exti.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_core.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c;Middlewares\ST\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Src\usbd_hid.c;Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c;Core\Src\system_stm32f1xx.c;;; +HeaderPath=Drivers\STM32F1xx_HAL_Driver\Inc;Drivers\STM32F1xx_HAL_Driver\Inc\Legacy;Middlewares\ST\STM32_USB_Device_Library\Core\Inc;Middlewares\ST\STM32_USB_Device_Library\Class\HID\Inc;Drivers\CMSIS\Device\ST\STM32F1xx\Include;Drivers\CMSIS\Include;USB_DEVICE\App;USB_DEVICE\Target;Core\Inc; +CDefines=USE_HAL_DRIVER;STM32F103xB;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=6 +HeaderFiles#0=..\USB_DEVICE\App\usb_device.h +HeaderFiles#1=..\USB_DEVICE\Target\usbd_conf.h +HeaderFiles#2=..\USB_DEVICE\App\usbd_desc.h +HeaderFiles#3=..\Core\Inc\stm32f1xx_it.h +HeaderFiles#4=..\Core\Inc\stm32f1xx_hal_conf.h +HeaderFiles#5=..\Core\Inc\main.h +HeaderFolderListSize=3 +HeaderPath#0=..\USB_DEVICE\App +HeaderPath#1=..\USB_DEVICE\Target +HeaderPath#2=..\Core\Inc +HeaderFiles=; +SourceFileListSize=6 +SourceFiles#0=..\USB_DEVICE\App\usb_device.c +SourceFiles#1=..\USB_DEVICE\Target\usbd_conf.c +SourceFiles#2=..\USB_DEVICE\App\usbd_desc.c +SourceFiles#3=..\Core\Src\stm32f1xx_it.c +SourceFiles#4=..\Core\Src\stm32f1xx_hal_msp.c +SourceFiles#5=..\Core\Src\main.c +SourceFolderListSize=3 +SourcePath#0=..\USB_DEVICE\App +SourcePath#1=..\USB_DEVICE\Target +SourcePath#2=..\Core\Src +SourceFiles=; + diff --git a/arcadestick_software/.settings/bundles-lock.store.json b/arcadestick_software/.settings/bundles-lock.store.json new file mode 100644 index 0000000..883cc39 --- /dev/null +++ b/arcadestick_software/.settings/bundles-lock.store.json @@ -0,0 +1,246 @@ +{ + "resolved": [ + { + "name": "cmake", + "version": "4.3.1+st.1", + "platform": "darwin", + "selected_by": [ + { + "name": "cmake", + "version": "4.3.1+st.1" + } + ] + }, + { + "name": "cmake", + "version": "4.3.1+st.1", + "platform": "x86_64-linux", + "selected_by": [ + { + "name": "cmake", + "version": "4.3.1+st.1" + } + ] + }, + { + "name": "cmake", + "version": "4.3.1+st.1", + "platform": "x86_64-windows", + "selected_by": [ + { + "name": "cmake", + "version": "4.3.1+st.1" + } + ] + }, + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2", + "platform": "aarch64-darwin", + "selected_by": [ + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2" + } + ] + }, + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2", + "platform": "x86_64-darwin", + "selected_by": [ + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2" + } + ] + }, + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2", + "platform": "x86_64-linux", + "selected_by": [ + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2" + } + ] + }, + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2", + "platform": "x86_64-windows", + "selected_by": [ + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2" + } + ] + }, + { + "name": "gnu-tools-for-stm32-14_3_1-description", + "version": "1.0.1+st.2", + "platform": "all", + "selected_by": [ + { + "name": "gnu-tools-for-stm32-14_3_1-description", + "version": ">=0.0.1" + } + ] + }, + { + "name": "ninja", + "version": "1.13.2+st.1", + "platform": "darwin", + "selected_by": [ + { + "name": "ninja", + "version": "1.13.2+st.1" + } + ] + }, + { + "name": "ninja", + "version": "1.13.2+st.1", + "platform": "x86_64-linux", + "selected_by": [ + { + "name": "ninja", + "version": "1.13.2+st.1" + } + ] + }, + { + "name": "ninja", + "version": "1.13.2+st.1", + "platform": "x86_64-windows", + "selected_by": [ + { + "name": "ninja", + "version": "1.13.2+st.1" + } + ] + }, + { + "name": "programmer", + "version": "2.23.0", + "platform": "aarch64-darwin", + "selected_by": [ + { + "name": "programmer", + "version": "2.23.0" + } + ] + }, + { + "name": "programmer", + "version": "2.23.0", + "platform": "x86_64-darwin", + "selected_by": [ + { + "name": "programmer", + "version": "2.23.0" + } + ] + }, + { + "name": "programmer", + "version": "2.23.0", + "platform": "x86_64-linux", + "selected_by": [ + { + "name": "programmer", + "version": "2.23.0" + } + ] + }, + { + "name": "programmer", + "version": "2.23.0", + "platform": "x86_64-windows", + "selected_by": [ + { + "name": "programmer", + "version": "2.23.0" + } + ] + }, + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2", + "platform": "darwin", + "selected_by": [ + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2" + } + ] + }, + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2", + "platform": "x86_64-linux", + "selected_by": [ + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2" + } + ] + }, + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2", + "platform": "x86_64-windows", + "selected_by": [ + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2" + } + ] + }, + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2", + "platform": "aarch64-darwin", + "selected_by": [ + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2" + } + ] + }, + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2", + "platform": "x86_64-darwin", + "selected_by": [ + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2" + } + ] + }, + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2", + "platform": "x86_64-linux", + "selected_by": [ + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2" + } + ] + }, + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2", + "platform": "x86_64-windows", + "selected_by": [ + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2" + } + ] + } + ] +} diff --git a/arcadestick_software/.settings/bundles.store.json b/arcadestick_software/.settings/bundles.store.json new file mode 100644 index 0000000..99144cc --- /dev/null +++ b/arcadestick_software/.settings/bundles.store.json @@ -0,0 +1,28 @@ +{ + "bundles": [ + { + "name": "cmake", + "version": "4.3.1+st.1" + }, + { + "name": "ninja", + "version": "1.13.2+st.1" + }, + { + "name": "gnu-tools-for-stm32", + "version": "14.3.1+st.2" + }, + { + "name": "st-arm-clangd", + "version": "21.1.0+st.2" + }, + { + "name": "programmer", + "version": "2.23.0" + }, + { + "name": "stlink-gdbserver", + "version": "7.14.0+st.2" + } + ] +} diff --git a/arcadestick_software/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs b/arcadestick_software/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs new file mode 100644 index 0000000..98a69fc --- /dev/null +++ b/arcadestick_software/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}} diff --git a/arcadestick_software/.settings/ide.store.json b/arcadestick_software/.settings/ide.store.json new file mode 100644 index 0000000..faf8f6a --- /dev/null +++ b/arcadestick_software/.settings/ide.store.json @@ -0,0 +1,9 @@ +{ + "device": "STM32F103RBT6", + "core": "Cortex-M3", + "order": 0, + "toolchain": "GCC", + "source": { + "sourceType": "STM32CubeIDE" + } +} diff --git a/arcadestick_software/.settings/language.settings.xml b/arcadestick_software/.settings/language.settings.xml new file mode 100644 index 0000000..ca92054 --- /dev/null +++ b/arcadestick_software/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/arcadestick_software/.settings/org.eclipse.core.resources.prefs b/arcadestick_software/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/arcadestick_software/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/arcadestick_software/.settings/stm32cubeide.project.prefs b/arcadestick_software/.settings/stm32cubeide.project.prefs new file mode 100644 index 0000000..db865fe --- /dev/null +++ b/arcadestick_software/.settings/stm32cubeide.project.prefs @@ -0,0 +1,3 @@ +8DF89ED150041C4CBC7CB9A9CAA90856=31C6D58186E7CE1B4FD55258E0F87868 +DC22A860405A8BF2F2C095E5B6529F12=7F7440E86AFFF3F487044327ECCEF390 +eclipse.preferences.version=1 diff --git a/arcadestick_software/.vscode/c_cpp_properties.json b/arcadestick_software/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..233ee1f --- /dev/null +++ b/arcadestick_software/.vscode/c_cpp_properties.json @@ -0,0 +1,8 @@ +{ + "configurations": [ + { + "name": "STM32", + "compileCommands": "${workspaceFolder}/build/Debug/compile_commands.json" + } + ] +} \ No newline at end of file diff --git a/arcadestick_software/.vscode/extensions.json b/arcadestick_software/.vscode/extensions.json new file mode 100644 index 0000000..4619436 --- /dev/null +++ b/arcadestick_software/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "stmicroelectronics.stm32-vscode-extension", + "ms-vscode.cmake-tools" + ] +} diff --git a/arcadestick_software/.vscode/launch.json b/arcadestick_software/.vscode/launch.json new file mode 100644 index 0000000..cf6788a --- /dev/null +++ b/arcadestick_software/.vscode/launch.json @@ -0,0 +1,62 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "STM32: Debug Arcade Stick (ST-Link)", + "type": "stlinkgdbtarget", + "request": "launch", + "origin": "snippet", + "cwd": "${workspaceFolder}", + "preLaunchTask": "CMake: build", + "runEntry": "main", + "deviceName": "STM32F103RBT6", + "deviceCore": "Cortex-M3", + "serverInterface": "SWD", + "serverInterfaceFrequency": "Auto", + "serverVerify": true, + "imagesAndSymbols": [ + { + "imageFileName": "${workspaceFolder}/build/Debug/arcadestick.elf" + } + ] + }, + { + "name": "STM32: Debug Arcade Stick XInput (ST-Link)", + "type": "stlinkgdbtarget", + "request": "launch", + "origin": "snippet", + "cwd": "${workspaceFolder}", + "preLaunchTask": "CMake: build XInput", + "runEntry": "main", + "deviceName": "STM32F103RBT6", + "deviceCore": "Cortex-M3", + "serverInterface": "SWD", + "serverInterfaceFrequency": "Auto", + "serverVerify": true, + "imagesAndSymbols": [ + { + "imageFileName": "${workspaceFolder}/build/Debug/arcadestick_xinput.elf" + } + ] + }, + { + "name": "STM32: Debug Arcade Stick Bootloader (ST-Link)", + "type": "stlinkgdbtarget", + "request": "launch", + "origin": "snippet", + "cwd": "${workspaceFolder}", + "preLaunchTask": "CMake: build Bootloader", + "runEntry": "main", + "deviceName": "STM32F103RBT6", + "deviceCore": "Cortex-M3", + "serverInterface": "SWD", + "serverInterfaceFrequency": "Auto", + "serverVerify": true, + "imagesAndSymbols": [ + { + "imageFileName": "${workspaceFolder}/build/Debug/arcadestick_bootloader.elf" + } + ] + } + ] +} diff --git a/arcadestick_software/.vscode/settings.json b/arcadestick_software/.vscode/settings.json new file mode 100644 index 0000000..1eaade7 --- /dev/null +++ b/arcadestick_software/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "cmake.ignoreCMakeListsMissing": false, + "cmake.useCMakePresets": "always", + "cmake.configureOnOpen": true, + "cmake.cmakePath": "cube-cmake", + "cmake.configureArgs": [ + "-DCMAKE_COMMAND=cube-cmake" + ], + "cmake.preferredGenerators": [ + "Ninja" + ], + "stm32cube-ide-clangd.path": "cube", + "stm32cube-ide-clangd.arguments": [ + "starm-clangd", + "--query-driver=${env:CUBE_BUNDLE_PATH}/gnu-tools-for-stm32/14.3.1+st.2/bin/arm-none-eabi-gcc*", + "--query-driver=${env:CUBE_BUNDLE_PATH}/gnu-tools-for-stm32/14.3.1+st.2/bin/arm-none-eabi-g++*" + ] +} diff --git a/arcadestick_software/.vscode/tasks.json b/arcadestick_software/.vscode/tasks.json new file mode 100644 index 0000000..c24c9c8 --- /dev/null +++ b/arcadestick_software/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "cmake", + "label": "CMake: build", + "command": "build", + "targets": [ + "all" + ], + "preset": "Debug", + "group": "build", + "problemMatcher": [], + "detail": "CMake template build task" + }, + { + "type": "cmake", + "label": "CMake: build XInput", + "command": "build", + "targets": [ + "arcadestick_xinput" + ], + "preset": "Debug", + "group": "build", + "problemMatcher": [], + "detail": "Build the standalone XInput firmware" + }, + { + "type": "cmake", + "label": "CMake: build Bootloader", + "command": "build", + "targets": [ + "arcadestick_bootloader" + ], + "preset": "Debug", + "group": "build", + "problemMatcher": [], + "detail": "Build the USB DFU bootloader" + } + ] +} diff --git a/arcadestick_software/CMakeLists.txt b/arcadestick_software/CMakeLists.txt new file mode 100644 index 0000000..af046ed --- /dev/null +++ b/arcadestick_software/CMakeLists.txt @@ -0,0 +1,229 @@ +cmake_minimum_required(VERSION 3.22) + +# This file is kept by CubeMX. Generated sources live in cmake/stm32cubemx. +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug) +endif() + +set(CMAKE_PROJECT_NAME arcadestick) + +# Target information used by the generic STM32 GCC toolchain. +set(CPU Cortex-M3) +set(FPU NO_FPU) +set(DSP NO_DSP) +set(MVE NO_MVE) +set(BYTE_ORDER Little-endian) + +include(cmake/gcc-arm-none-eabi.cmake) +set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) + +project(${CMAKE_PROJECT_NAME} LANGUAGES C ASM) +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") + +add_executable(${CMAKE_PROJECT_NAME}) +add_subdirectory(cmake/stm32cubemx) + +# DInput uses a project-owned composite class. Keep the CubeMX generated +# target, but replace only its application source list so regeneration cannot +# silently switch the firmware back to the single-interface HID class. +set_property(TARGET ${CMAKE_PROJECT_NAME} PROPERTY SOURCES + USB_DEVICE/Target/usbd_conf.c + USB_DEVICE/App/usb_device_dinput.c + USB_DEVICE/App/usbd_desc_dinput.c + USB_DEVICE/App/usbd_dinput.c + Core/Src/main.c + Core/Src/dinput_app.c + Core/Src/stm32f1xx_it.c + Core/Src/stm32f1xx_hal_msp.c + Core/Src/sysmem.c + Core/Src/syscalls.c + startup_stm32f103xb.s +) + +# Options shared by CubeMX application, HAL and USB object libraries. +target_compile_options(stm32cubemx INTERFACE + ${CPU_FLAGS} + --specs=nano.specs + -Wall + -fstack-usage +) + +# Keep reusable HAL/USB code compact in every configuration. Application +# sources still use -O0 in Debug so breakpoints and local variables behave well. +target_compile_options(STM32_Drivers PRIVATE -Os $<$:-g3>) +target_compile_options(USB_Device_Library PRIVATE -Os $<$:-g3>) + +target_link_libraries(${CMAKE_PROJECT_NAME} stm32cubemx) +target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE + $<$:-O0> + $<$:-g3> + $<$:-Os> +) +target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE + REFLEKS_DINPUT + APP_VECTOR_ADDRESS=0x08013000U +) +set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES SUFFIX ".elf") + +target_link_options(${CMAKE_PROJECT_NAME} PRIVATE + ${CPU_FLAGS} + --specs=nano.specs + --specs=nosys.specs + -T${CMAKE_CURRENT_SOURCE_DIR}/STM32F103xx_FLASH.ld + -Wl,--defsym=FIRMWARE_FLASH_ORIGIN=0x08013000 + -Wl,--defsym=FIRMWARE_FLASH_LENGTH=0x0000D000 + -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.map + -Wl,--gc-sections + -Wl,--print-memory-usage + -static +) + +set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/STM32F103xx_FLASH.ld +) + +# XInput application image in App1. +set(XINPUT_TARGET arcadestick_xinput) +add_executable(${XINPUT_TARGET} + USB_DEVICE/Target/usbd_conf.c + USB_DEVICE/App/usb_device_xinput.c + USB_DEVICE/App/usbd_desc_xinput.c + USB_DEVICE/App/usbd_xinput.c + Core/Src/main.c + Core/Src/xinput_app.c + Core/Src/stm32f1xx_it.c + Core/Src/stm32f1xx_hal_msp.c + Core/Src/sysmem.c + Core/Src/syscalls.c + startup_stm32f103xb.s +) + +target_compile_definitions(${XINPUT_TARGET} PRIVATE + REFLEKS_XINPUT + APP_VECTOR_ADDRESS=0x08006000U +) +target_include_directories(${XINPUT_TARGET} PRIVATE USB_DEVICE/App Core/Inc) +target_compile_options(${XINPUT_TARGET} PRIVATE + ${CPU_FLAGS} + --specs=nano.specs + -Wall + -fstack-usage + $<$:-O0> + $<$:-g3> + $<$:-Os> +) +target_link_libraries(${XINPUT_TARGET} PRIVATE + stm32cubemx + STM32_Drivers + USB_Device_Library + ${TOOLCHAIN_LINK_LIBRARIES} +) +set_target_properties(${XINPUT_TARGET} PROPERTIES SUFFIX ".elf") +target_link_options(${XINPUT_TARGET} PRIVATE + ${CPU_FLAGS} + --specs=nano.specs + --specs=nosys.specs + -T${CMAKE_CURRENT_SOURCE_DIR}/STM32F103xx_FLASH.ld + -Wl,--defsym=FIRMWARE_FLASH_ORIGIN=0x08006000 + -Wl,--defsym=FIRMWARE_FLASH_LENGTH=0x0000D000 + -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${XINPUT_TARGET}.map + -Wl,--gc-sections + -Wl,--print-memory-usage + -static +) +set_target_properties(${XINPUT_TARGET} PROPERTIES + LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/STM32F103xx_FLASH.ld + ADDITIONAL_CLEAN_FILES ${XINPUT_TARGET}.map +) + +# USB DFU bootloader at the beginning of flash. +set(BOOTLOADER_TARGET arcadestick_bootloader) +add_executable(${BOOTLOADER_TARGET} + USB_DEVICE/Target/usbd_conf.c + USB_DEVICE/App/usb_device_dfu.c + USB_DEVICE/App/usbd_desc_dfu.c + USB_DEVICE/App/usbd_dfu_bootloader.c + Core/Src/bootloader_main.c + Core/Src/stm32f1xx_it.c + Core/Src/stm32f1xx_hal_msp.c + Core/Src/sysmem.c + Core/Src/syscalls.c + startup_stm32f103xb.s +) +target_compile_definitions(${BOOTLOADER_TARGET} PRIVATE REFLEKS_DFU) +target_include_directories(${BOOTLOADER_TARGET} PRIVATE USB_DEVICE/App Core/Inc) +target_compile_options(${BOOTLOADER_TARGET} PRIVATE + ${CPU_FLAGS} + --specs=nano.specs + -Wall + -Os + -g3 + -fstack-usage +) +target_link_libraries(${BOOTLOADER_TARGET} PRIVATE + stm32cubemx + STM32_Drivers + USB_Device_Library + ${TOOLCHAIN_LINK_LIBRARIES} +) +set_target_properties(${BOOTLOADER_TARGET} PROPERTIES SUFFIX ".elf") +target_link_options(${BOOTLOADER_TARGET} PRIVATE + ${CPU_FLAGS} + --specs=nano.specs + --specs=nosys.specs + -T${CMAKE_CURRENT_SOURCE_DIR}/STM32F103xx_FLASH.ld + -Wl,--defsym=FIRMWARE_FLASH_ORIGIN=0x08000000 + -Wl,--defsym=FIRMWARE_FLASH_LENGTH=0x00006000 + -Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${BOOTLOADER_TARGET}.map + -Wl,--gc-sections + -Wl,--print-memory-usage + -static +) +set_target_properties(${BOOTLOADER_TARGET} PROPERTIES + LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/STM32F103xx_FLASH.ld + ADDITIONAL_CLEAN_FILES ${BOOTLOADER_TARGET}.map +) + +foreach(FIRMWARE_TARGET IN ITEMS + ${CMAKE_PROJECT_NAME} + ${XINPUT_TARGET} + ${BOOTLOADER_TARGET}) + add_custom_command(TARGET ${FIRMWARE_TARGET} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O ihex + $ + ${CMAKE_CURRENT_BINARY_DIR}/${FIRMWARE_TARGET}.hex + COMMAND ${CMAKE_OBJCOPY} -O binary + $ + ${CMAKE_CURRENT_BINARY_DIR}/${FIRMWARE_TARGET}.bin + COMMENT "Generating ${FIRMWARE_TARGET}.hex and ${FIRMWARE_TARGET}.bin" + ) +endforeach() + +set(FULL_FIRMWARE_BIN ${CMAKE_CURRENT_BINARY_DIR}/arcadestick_full.bin) +set(FULL_FIRMWARE_HEX ${CMAKE_CURRENT_BINARY_DIR}/arcadestick_full.hex) +add_custom_command( + OUTPUT ${FULL_FIRMWARE_BIN} ${FULL_FIRMWARE_HEX} + COMMAND powershell.exe -NoProfile -ExecutionPolicy Bypass + -File ${CMAKE_CURRENT_SOURCE_DIR}/tools/package_firmware.ps1 + -Bootloader ${CMAKE_CURRENT_BINARY_DIR}/${BOOTLOADER_TARGET}.bin + -App1 ${CMAKE_CURRENT_BINARY_DIR}/${XINPUT_TARGET}.bin + -App2 ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.bin + -Output ${FULL_FIRMWARE_BIN} + COMMAND ${CMAKE_OBJCOPY} -I binary -O ihex + --change-addresses=0x08000000 + ${FULL_FIRMWARE_BIN} ${FULL_FIRMWARE_HEX} + DEPENDS + ${BOOTLOADER_TARGET} + ${XINPUT_TARGET} + ${CMAKE_PROJECT_NAME} + ${CMAKE_CURRENT_SOURCE_DIR}/tools/package_firmware.ps1 + COMMENT "Packaging bootloader, XInput App1 and DInput App2" + VERBATIM +) +add_custom_target(arcadestick_package ALL + DEPENDS ${FULL_FIRMWARE_BIN} ${FULL_FIRMWARE_HEX} +) diff --git a/arcadestick_software/CMakePresets.json b/arcadestick_software/CMakePresets.json new file mode 100644 index 0000000..6a6ca90 --- /dev/null +++ b/arcadestick_software/CMakePresets.json @@ -0,0 +1,35 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "hidden": true, + "generator": "Ninja", + "binaryDir": "${sourceDir}/build/${presetName}" + }, + { + "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/arcadestick_software/Core/Inc/dinput_app.h b/arcadestick_software/Core/Inc/dinput_app.h new file mode 100644 index 0000000..9834dc3 --- /dev/null +++ b/arcadestick_software/Core/Inc/dinput_app.h @@ -0,0 +1,6 @@ +#ifndef DINPUT_APP_H +#define DINPUT_APP_H + +void DInput_AppProcess(void); + +#endif /* DINPUT_APP_H */ diff --git a/arcadestick_software/Core/Inc/main.h b/arcadestick_software/Core/Inc/main.h new file mode 100644 index 0000000..142b4f4 --- /dev/null +++ b/arcadestick_software/Core/Inc/main.h @@ -0,0 +1,101 @@ +/* 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 "stm32f1xx_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 Start_Pin GPIO_PIN_14 +#define Start_GPIO_Port GPIOC +#define UP_Pin GPIO_PIN_0 +#define UP_GPIO_Port GPIOC +#define DOWN_Pin GPIO_PIN_1 +#define DOWN_GPIO_Port GPIOC +#define RIGHT_Pin GPIO_PIN_2 +#define RIGHT_GPIO_Port GPIOC +#define LEFT_Pin GPIO_PIN_3 +#define LEFT_GPIO_Port GPIOC +#define Select_Pin GPIO_PIN_2 +#define Select_GPIO_Port GPIOA +#define DINPUT_Pin GPIO_PIN_4 +#define DINPUT_GPIO_Port GPIOA +#define XINPUT_Pin GPIO_PIN_5 +#define XINPUT_GPIO_Port GPIOA +#define A_Pin GPIO_PIN_4 +#define A_GPIO_Port GPIOC +#define B_Pin GPIO_PIN_5 +#define B_GPIO_Port GPIOC +#define Y_Pin GPIO_PIN_6 +#define Y_GPIO_Port GPIOC +#define X_Pin GPIO_PIN_7 +#define X_GPIO_Port GPIOC +#define RB_Pin GPIO_PIN_8 +#define RB_GPIO_Port GPIOC +#define RT_Pin GPIO_PIN_9 +#define RT_GPIO_Port GPIOC +#define LB_Pin GPIO_PIN_10 +#define LB_GPIO_Port GPIOC +#define LT_Pin GPIO_PIN_11 +#define LT_GPIO_Port GPIOC + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/arcadestick_software/Core/Inc/stm32f1xx_hal_conf.h b/arcadestick_software/Core/Inc/stm32f1xx_hal_conf.h new file mode 100644 index 0000000..970e15d --- /dev/null +++ b/arcadestick_software/Core/Inc/stm32f1xx_hal_conf.h @@ -0,0 +1,391 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @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 __STM32F1xx_HAL_CONF_H +#define __STM32F1xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED + /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_CAN_LEGACY_MODULE_ENABLED */ +/*#define HAL_CEC_MODULE_ENABLED */ +/*#define HAL_CORTEX_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DMA_MODULE_ENABLED */ +/*#define HAL_ETH_MODULE_ENABLED */ +/*#define HAL_FLASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +/*#define HAL_I2C_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_PCCARD_MODULE_ENABLED */ +#define HAL_PCD_MODULE_ENABLED +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_PWR_MODULE_ENABLED */ +/*#define HAL_RCC_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_SDRAM_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_UART_MODULE_ENABLED */ +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ + +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 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 8000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 40000U /*!< 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. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External 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 */ + +/* 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 15U /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_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_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH 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_I2S_REGISTER_CALLBACKS 0U /* I2S 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_RTC_REGISTER_CALLBACKS 0U /* RTC 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_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM 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 8U /* 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 0x01U +/* 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)0x00) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< 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 "stm32f1xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32f1xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32f1xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32f1xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED +#include "stm32f1xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED +#include "stm32f1xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "Legacy/stm32f1xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32f1xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32f1xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32f1xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32f1xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32f1xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32f1xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32f1xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32f1xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32f1xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32f1xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32f1xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32f1xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32f1xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED +#include "stm32f1xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32f1xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32f1xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32f1xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32f1xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32f1xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32f1xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32f1xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32f1xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32f1xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32f1xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32f1xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32f1xx_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 /* __STM32F1xx_HAL_CONF_H */ + diff --git a/arcadestick_software/Core/Inc/stm32f1xx_it.h b/arcadestick_software/Core/Inc/stm32f1xx_it.h new file mode 100644 index 0000000..d6d8cac --- /dev/null +++ b/arcadestick_software/Core/Inc/stm32f1xx_it.h @@ -0,0 +1,67 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_IT_H +#define __STM32F1xx_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 USB_LP_CAN1_RX0_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_IT_H */ diff --git a/arcadestick_software/Core/Inc/xinput_app.h b/arcadestick_software/Core/Inc/xinput_app.h new file mode 100644 index 0000000..ab6a24b --- /dev/null +++ b/arcadestick_software/Core/Inc/xinput_app.h @@ -0,0 +1,6 @@ +#ifndef XINPUT_APP_H +#define XINPUT_APP_H + +void XInput_AppProcess(void); + +#endif /* XINPUT_APP_H */ diff --git a/arcadestick_software/Core/Src/bootloader_main.c b/arcadestick_software/Core/Src/bootloader_main.c new file mode 100644 index 0000000..9eecd8e --- /dev/null +++ b/arcadestick_software/Core/Src/bootloader_main.c @@ -0,0 +1,155 @@ +#include "main.h" +#include "usb_device.h" +#include "usbd_dfu_bootloader.h" + +typedef void (*ApplicationEntry)(void); + +static void Bootloader_SystemClockConfig(void); +static void Bootloader_GPIOInit(void); +static uint8_t Bootloader_IsApplicationValid(uint32_t address); +static void Bootloader_JumpToApplication(uint32_t address); + +int main(void) +{ + uint32_t selectedAddress = 0U; + + HAL_Init(); + Bootloader_GPIOInit(); + HAL_Delay(20U); + + /* Holding START during reset always forces USB DFU mode. */ + if (HAL_GPIO_ReadPin(Start_GPIO_Port, Start_Pin) != GPIO_PIN_RESET) + { + GPIO_PinState pa4 = HAL_GPIO_ReadPin(DINPUT_GPIO_Port, DINPUT_Pin); + GPIO_PinState pa5 = HAL_GPIO_ReadPin(XINPUT_GPIO_Port, XINPUT_Pin); + + /* Actual board wiring: PA4 LOW selects XInput, PA5 LOW selects DInput. */ + if ((pa4 == GPIO_PIN_RESET) && (pa5 == GPIO_PIN_SET)) + { + selectedAddress = DFU_APP1_ADDRESS; + } + else if ((pa4 == GPIO_PIN_SET) && (pa5 == GPIO_PIN_RESET)) + { + selectedAddress = DFU_APP2_ADDRESS; + } + } + + if ((selectedAddress != 0U) && Bootloader_IsApplicationValid(selectedAddress)) + { + Bootloader_JumpToApplication(selectedAddress); + } + + Bootloader_SystemClockConfig(); + MX_USB_DEVICE_Init(); + + while (1) + { + } +} + +static void Bootloader_GPIOInit(void) +{ + GPIO_InitTypeDef gpio = {0}; + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + + gpio.Pin = DINPUT_Pin | XINPUT_Pin; + gpio.Mode = GPIO_MODE_INPUT; + gpio.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOA, &gpio); + + gpio.Pin = Start_Pin; + HAL_GPIO_Init(GPIOC, &gpio); +} + +static uint8_t Bootloader_IsApplicationValid(uint32_t address) +{ + uint32_t stackPointer = *(volatile uint32_t *)address; + uint32_t resetHandler = *(volatile uint32_t *)(address + 4U); + uint32_t slotEnd = address + DFU_APP_SLOT_SIZE; + + return ((stackPointer >= SRAM_BASE) && + (stackPointer <= (SRAM_BASE + (20U * 1024U))) && + ((resetHandler & 1U) != 0U) && + ((resetHandler & ~1U) >= address) && + ((resetHandler & ~1U) < slotEnd)) ? 1U : 0U; +} + +static void Bootloader_JumpToApplication(uint32_t address) +{ + uint32_t stackPointer = *(volatile uint32_t *)address; + uint32_t resetHandler = *(volatile uint32_t *)(address + 4U); + + __disable_irq(); + SysTick->CTRL = 0U; + SysTick->LOAD = 0U; + SysTick->VAL = 0U; + HAL_DeInit(); + + NVIC->ICER[0] = 0xFFFFFFFFU; + NVIC->ICER[1] = 0xFFFFFFFFU; + NVIC->ICPR[0] = 0xFFFFFFFFU; + NVIC->ICPR[1] = 0xFFFFFFFFU; + + SCB->VTOR = address; + __DSB(); + __ISB(); + __enable_irq(); + + __asm volatile ( + "msr msp, %0\n" + "bx %1\n" + : + : "r" (stackPointer), "r" (resetHandler) + : "memory"); + + while (1) + { + } +} + +static void Bootloader_SystemClockConfig(void) +{ + RCC_OscInitTypeDef oscillator = {0}; + RCC_ClkInitTypeDef clocks = {0}; + RCC_PeriphCLKInitTypeDef peripheral = {0}; + + oscillator.OscillatorType = RCC_OSCILLATORTYPE_HSE; + oscillator.HSEState = RCC_HSE_ON; + oscillator.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + oscillator.HSIState = RCC_HSI_ON; + oscillator.PLL.PLLState = RCC_PLL_ON; + oscillator.PLL.PLLSource = RCC_PLLSOURCE_HSE; + oscillator.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&oscillator) != HAL_OK) + { + Error_Handler(); + } + + clocks.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | + RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + clocks.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + clocks.AHBCLKDivider = RCC_SYSCLK_DIV1; + clocks.APB1CLKDivider = RCC_HCLK_DIV2; + clocks.APB2CLKDivider = RCC_HCLK_DIV1; + if (HAL_RCC_ClockConfig(&clocks, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + + peripheral.PeriphClockSelection = RCC_PERIPHCLK_USB; + peripheral.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&peripheral) != HAL_OK) + { + Error_Handler(); + } +} + +void Error_Handler(void) +{ + __disable_irq(); + while (1) + { + } +} diff --git a/arcadestick_software/Core/Src/dinput_app.c b/arcadestick_software/Core/Src/dinput_app.c new file mode 100644 index 0000000..7b1d5da --- /dev/null +++ b/arcadestick_software/Core/Src/dinput_app.c @@ -0,0 +1,66 @@ +#include "dinput_app.h" + +#include "main.h" +#include "usb_device.h" +#include "usbd_dinput.h" + +typedef struct __attribute__((packed)) +{ + uint16_t buttons; + uint8_t hat; + uint8_t axes[6]; +} DInputReport; + +_Static_assert(sizeof(DInputReport) == DINPUT_REPORT_SIZE, + "DInput input report must be exactly 9 bytes"); + +extern USBD_HandleTypeDef hUsbDeviceFS; + +static uint8_t IsPressed(GPIO_TypeDef *port, uint16_t pin) +{ + return (HAL_GPIO_ReadPin(port, pin) == GPIO_PIN_RESET) ? 1U : 0U; +} + +static uint8_t ReadHat(void) +{ + uint8_t up = IsPressed(UP_GPIO_Port, UP_Pin); + uint8_t down = IsPressed(DOWN_GPIO_Port, DOWN_Pin); + uint8_t left = IsPressed(LEFT_GPIO_Port, LEFT_Pin); + uint8_t right = IsPressed(RIGHT_GPIO_Port, RIGHT_Pin); + + if (up && right && !down && !left) return 1U; + if (down && right && !up && !left) return 3U; + if (down && left && !up && !right) return 5U; + if (up && left && !down && !right) return 7U; + if (up && !down && !left && !right) return 0U; + if (right && !up && !down && !left) return 2U; + if (down && !up && !left && !right) return 4U; + if (left && !up && !down && !right) return 6U; + return 8U; +} + +void DInput_AppProcess(void) +{ + DInputReport report = + { + .buttons = 0U, + .hat = 8U, + .axes = {0x80U, 0x80U, 0x80U, 0x80U, 0x80U, 0x80U} + }; + + report.hat = ReadHat(); + if (IsPressed(X_GPIO_Port, X_Pin)) report.buttons |= (1U << 0); + if (IsPressed(Y_GPIO_Port, Y_Pin)) report.buttons |= (1U << 1); + if (IsPressed(A_GPIO_Port, A_Pin)) report.buttons |= (1U << 2); + if (IsPressed(B_GPIO_Port, B_Pin)) report.buttons |= (1U << 3); + if (IsPressed(RB_GPIO_Port, RB_Pin)) report.buttons |= (1U << 4); + if (IsPressed(LB_GPIO_Port, LB_Pin)) report.buttons |= (1U << 5); + if (IsPressed(RT_GPIO_Port, RT_Pin)) report.buttons |= (1U << 6); + if (IsPressed(LT_GPIO_Port, LT_Pin)) report.buttons |= (1U << 7); + if (IsPressed(Start_GPIO_Port, Start_Pin)) report.buttons |= (1U << 8); + if (IsPressed(Select_GPIO_Port, Select_Pin)) report.buttons |= (1U << 9); + + (void)USBD_DINPUT_SendReport(&hUsbDeviceFS, + (uint8_t *)&report, + sizeof(report)); +} diff --git a/arcadestick_software/Core/Src/main.c b/arcadestick_software/Core/Src/main.c new file mode 100644 index 0000000..007a2af --- /dev/null +++ b/arcadestick_software/Core/Src/main.c @@ -0,0 +1,530 @@ +/* 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 "usb_device.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "usbd_core.h" +#ifdef REFLEKS_XINPUT +#include "xinput_app.h" +#else +#include "dinput_app.h" +#endif +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +#define MODE_SWITCH_DEBOUNCE_MS 50U +#define USB_DISCONNECT_DELAY_MS 100U + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +static uint32_t modeSwitchChangedAt; +static uint8_t modeSwitchChangePending; + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +/* USER CODE BEGIN PFP */ +static void ModeSwitch_Process(void); + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +extern USBD_HandleTypeDef hUsbDeviceFS; +#if 0 /* Replaced by dinput_app.c; kept inside CubeMX user section only. */ +typedef struct +{ + uint8_t dpad; // D-pad (4 bit) [Up, Down, Left, Right] + uint8_t buttonLSB; // Buton 1-8 (1 bit) + uint8_t buttonMSB; // Buton 9-10 (1 bit) +} __attribute__((packed)) gamePAD; + +gamePAD gamepad = {0}; +#endif +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ +#ifdef APP_VECTOR_ADDRESS + /* Relocated applications must own all interrupts before HAL starts SysTick. */ + SCB->VTOR = APP_VECTOR_ADDRESS; + __DSB(); + __ISB(); +#endif + + /* 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_USB_DEVICE_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + ModeSwitch_Process(); + +#ifdef REFLEKS_XINPUT + XInput_AppProcess(); +#else + DInput_AppProcess(); +#if 0 /* Legacy 3-byte HID loop. */ + if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_SET && + HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_SET && + HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_SET && + HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_SET) + { + gamepad.dpad = 8; + //centre + } + else if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 1; + //up-right + } + } + else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 3; + //down-right + } + } + else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 5; + //down-left + } + } + else if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_RESET && + HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 7; + //up-left + } + } + else if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(UP_GPIO_Port, UP_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 0; + //up + } + + } + else if(HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(DOWN_GPIO_Port, DOWN_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 4; + //down + } + } + else if(HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(LEFT_GPIO_Port, LEFT_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 6; + //left + } + } + else if(HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_RESET) + { + HAL_Delay(5); + if(HAL_GPIO_ReadPin(RIGHT_GPIO_Port, RIGHT_Pin) == GPIO_PIN_RESET) + { + gamepad.dpad = 2; + //right + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(X_GPIO_Port, X_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(X_GPIO_Port, X_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |=1 << 0; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(Y_GPIO_Port, Y_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(Y_GPIO_Port, Y_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 1; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 2; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 3; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(RB_GPIO_Port, RB_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(RB_GPIO_Port, RB_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 4; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(LB_GPIO_Port, LB_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(LB_GPIO_Port, LB_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 5; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(RT_GPIO_Port, RT_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(RT_GPIO_Port, RT_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 6; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(LT_GPIO_Port, LT_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(LT_GPIO_Port, LT_Pin)== GPIO_PIN_RESET) { + gamepad.buttonLSB |= 1 << 7; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(Start_GPIO_Port, Start_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(Start_GPIO_Port, Start_Pin)== GPIO_PIN_RESET) { + gamepad.buttonMSB |= 1 << 0; + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(Select_GPIO_Port, Select_Pin)== GPIO_PIN_RESET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(Select_GPIO_Port, Select_Pin)== GPIO_PIN_RESET) { + gamepad.buttonMSB |= 1 << 1; + } + } + + + + + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(X_GPIO_Port, X_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(X_GPIO_Port, X_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~(1 << 0); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(Y_GPIO_Port, Y_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(Y_GPIO_Port, Y_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~ (1 << 1); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~(1 << 2); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~(1 << 3); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(RB_GPIO_Port, RB_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(RB_GPIO_Port, RB_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~(1 << 4); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(LB_GPIO_Port, LB_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(LB_GPIO_Port, LB_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~(1 << 5); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(RT_GPIO_Port, RT_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(RT_GPIO_Port, RT_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~ (1 << 6); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(LT_GPIO_Port, LT_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(LT_GPIO_Port, LT_Pin)== GPIO_PIN_SET) { + gamepad.buttonLSB &= ~(1 << 7); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(Start_GPIO_Port, Start_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(Start_GPIO_Port, Start_Pin)== GPIO_PIN_SET) { + gamepad.buttonMSB &= ~(1 << 0); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); + if (HAL_GPIO_ReadPin(Select_GPIO_Port, Select_Pin)== GPIO_PIN_SET) { + HAL_Delay(5); + if (HAL_GPIO_ReadPin(Select_GPIO_Port, Select_Pin)== GPIO_PIN_SET) { + gamepad.buttonMSB &= ~(1 << 1); + } + } + USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t *)&gamepad, sizeof(gamepad)); +#endif +#endif + + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** 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.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* USER CODE BEGIN MX_GPIO_Init_1 */ + + /* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pins : Start_Pin UP_Pin DOWN_Pin RIGHT_Pin + LEFT_Pin A_Pin B_Pin Y_Pin + X_Pin RB_Pin RT_Pin LB_Pin + LT_Pin */ + GPIO_InitStruct.Pin = Start_Pin|UP_Pin|DOWN_Pin|RIGHT_Pin + |LEFT_Pin|A_Pin|B_Pin|Y_Pin + |X_Pin|RB_Pin|RT_Pin|LB_Pin + |LT_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pins : Select_Pin DINPUT_Pin XINPUT_Pin */ + GPIO_InitStruct.Pin = Select_Pin|DINPUT_Pin|XINPUT_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + + /* USER CODE END MX_GPIO_Init_2 */ +} + +/* USER CODE BEGIN 4 */ +/** + * @brief Restarts the MCU when the slide switch requests the other USB mode. + * The bootloader will read the same switch and start the selected app. + */ +static void ModeSwitch_Process(void) +{ + GPIO_PinState dinputState = HAL_GPIO_ReadPin(DINPUT_GPIO_Port, DINPUT_Pin); + GPIO_PinState xinputState = HAL_GPIO_ReadPin(XINPUT_GPIO_Port, XINPUT_Pin); + + /* The switch is valid only when exactly one active-low input is selected. */ +#ifdef REFLEKS_XINPUT + if ((dinputState == GPIO_PIN_SET) && (xinputState == GPIO_PIN_RESET)) +#else + if ((dinputState == GPIO_PIN_RESET) && (xinputState == GPIO_PIN_SET)) +#endif + { + if (modeSwitchChangePending == 0U) + { + modeSwitchChangedAt = HAL_GetTick(); + modeSwitchChangePending = 1U; + } + else if ((HAL_GetTick() - modeSwitchChangedAt) >= MODE_SWITCH_DEBOUNCE_MS) + { + /* Force a clean USB disconnect before the bootloader changes USB mode. */ + (void)USBD_Stop(&hUsbDeviceFS); + HAL_Delay(USB_DISCONNECT_DELAY_MS); + NVIC_SystemReset(); + } + } + else + { + /* Current mode selected, both open, or switch contact transition/bounce. */ + modeSwitchChangePending = 0U; + } +} + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/arcadestick_software/Core/Src/stm32f1xx_hal_msp.c b/arcadestick_software/Core/Src/stm32f1xx_hal_msp.c new file mode 100644 index 0000000..f6c53b6 --- /dev/null +++ b/arcadestick_software/Core/Src/stm32f1xx_hal_msp.c @@ -0,0 +1,85 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_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_AFIO_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled + */ + __HAL_AFIO_REMAP_SWJ_NOJTAG(); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/arcadestick_software/Core/Src/stm32f1xx_it.c b/arcadestick_software/Core/Src/stm32f1xx_it.c new file mode 100644 index 0000000..17136fd --- /dev/null +++ b/arcadestick_software/Core/Src/stm32f1xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_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 "stm32f1xx_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 PCD_HandleTypeDef hpcd_USB_FS; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M3 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F1xx 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_stm32f1xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles USB low priority or CAN RX0 interrupts. + */ +void USB_LP_CAN1_RX0_IRQHandler(void) +{ + /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */ + + /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_FS); + /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */ + + /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/arcadestick_software/Core/Src/syscalls.c b/arcadestick_software/Core/Src/syscalls.c new file mode 100644 index 0000000..0197f26 --- /dev/null +++ b/arcadestick_software/Core/Src/syscalls.c @@ -0,0 +1,176 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeIDE + * @brief STM32CubeIDE Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-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. + * + ****************************************************************************** + */ + +/* 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; +} + +int _times(struct tms *buf) +{ + (void)buf; + return -1; +} + +int _stat(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; +} diff --git a/arcadestick_software/Core/Src/sysmem.c b/arcadestick_software/Core/Src/sysmem.c new file mode 100644 index 0000000..23ea8e0 --- /dev/null +++ b/arcadestick_software/Core/Src/sysmem.c @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeIDE + * @brief STM32CubeIDE System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ + +/* Includes */ +#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; +} diff --git a/arcadestick_software/Core/Src/system_stm32f1xx.c b/arcadestick_software/Core/Src/system_stm32f1xx.c new file mode 100644 index 0000000..3afa78d --- /dev/null +++ b/arcadestick_software/Core/Src/system_stm32f1xx.c @@ -0,0 +1,406 @@ +/** + ****************************************************************************** + * @file system_stm32f1xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * factors, AHB/APBx prescalers and Flash settings). + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f1xx_xx.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. + * + * 2. After each device reset the HSI (8 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f1xx_xx.s" file, to + * configure the system clock before to branch to main program. + * + * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depending on + * the product used), refer to "HSE_VALUE". + * When HSE is used as system clock source, directly or through PLL, and you + * are using different crystal you have to adapt the HSE value to your own + * configuration. + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017-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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f1xx_system + * @{ + */ + +/** @addtogroup STM32F1xx_System_Private_Includes + * @{ + */ + +#include "stm32f1xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Defines + * @{ + */ + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Default value of the External oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 8000000U /*!< Default value of the Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI_VALUE */ + +/*!< Uncomment the following line if you need to use external SRAM */ +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ + +/* 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. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset 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. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ + +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_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 = 8000000; +const uint8_t AHBPrescTable[16U] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8U] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +#ifdef DATA_IN_ExtSRAM + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemCoreClock variable. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +void SystemInit (void) +{ +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) + #ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); + #endif /* DATA_IN_ExtSRAM */ +#endif + + /* 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 by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value + * 8 MHz or 25 MHz, depending on the product used), 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 = 0U, pllmull = 0U, pllsource = 0U; + +#if defined(STM32F105xC) || defined(STM32F107xC) + uint32_t prediv1source = 0U, prediv1factor = 0U, prediv2factor = 0U, pll2mull = 0U; +#endif /* STM32F105xC */ + +#if defined(STM32F100xB) || defined(STM32F100xE) + uint32_t prediv1factor = 0U; +#endif /* STM32F100xB or STM32F100xE */ + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00U: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04U: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08U: /* PLL used as system clock */ + + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + +#if !defined(STM32F105xC) && !defined(STM32F107xC) + pllmull = ( pllmull >> 18U) + 2U; + + if (pllsource == 0x00U) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1U) * pllmull; + } + else + { + #if defined(STM32F100xB) || defined(STM32F100xE) + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + SystemCoreClock = (HSE_VALUE >> 1U) * pllmull; + } + else + { + SystemCoreClock = HSE_VALUE * pllmull; + } + #endif + } +#else + pllmull = pllmull >> 18U; + + if (pllmull != 0x0DU) + { + pllmull += 2U; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13U / 2U; + } + + if (pllsource == 0x00U) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1U) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U; + + if (prediv1source == 0U) + { + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4U) + 1U; + pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8U) + 2U; + SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F105xC */ + break; + + default: + SystemCoreClock = HSI_VALUE; + break; + } + + /* Compute HCLK clock frequency ----------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +/** + * @brief Setup the external memory controller. Called in startup_stm32f1xx.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f1xx_xx.s/.c before jump to main. + * This function configures the external SRAM mounted on STM3210E-EVAL + * board (STM32 High density devices). This SRAM will be used as program + * data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmpreg; + /*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is + required, then adjust the Register Addresses */ + + /* Enable FSMC clock */ + RCC->AHBENR = 0x00000114U; + + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN); + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ + RCC->APB2ENR = 0x000001E0U; + + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN); + + (void)(tmpreg); + +/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ +/*---------------- SRAM Address lines configuration -------------------------*/ +/*---------------- NOE and NWE configuration --------------------------------*/ +/*---------------- NE3 configuration ----------------------------------------*/ +/*---------------- NBL0, NBL1 configuration ---------------------------------*/ + + GPIOD->CRL = 0x44BB44BBU; + GPIOD->CRH = 0xBBBBBBBBU; + + GPIOE->CRL = 0xB44444BBU; + GPIOE->CRH = 0xBBBBBBBBU; + + GPIOF->CRL = 0x44BBBBBBU; + GPIOF->CRH = 0xBBBB4444U; + + GPIOG->CRL = 0x44BBBBBBU; + GPIOG->CRH = 0x444B4B44U; + +/*---------------- FSMC Configuration ---------------------------------------*/ +/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ + + FSMC_Bank1->BTCR[4U] = 0x00001091U; + FSMC_Bank1->BTCR[5U] = 0x00110212U; +} +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/arcadestick_software/Core/Src/xinput_app.c b/arcadestick_software/Core/Src/xinput_app.c new file mode 100644 index 0000000..f0b850a --- /dev/null +++ b/arcadestick_software/Core/Src/xinput_app.c @@ -0,0 +1,95 @@ +#include "xinput_app.h" + +#include "main.h" +#include "usb_device.h" +#include "usbd_xinput.h" + +typedef struct __attribute__((packed)) +{ + uint8_t reportId; + uint8_t reportSize; + uint8_t buttons1; + uint8_t buttons2; + uint8_t leftTrigger; + uint8_t rightTrigger; + int16_t leftX; + int16_t leftY; + int16_t rightX; + int16_t rightY; + uint8_t reserved[6]; +} XInputReport; + +_Static_assert(sizeof(XInputReport) == XINPUT_REPORT_SIZE, + "XInput input report must be exactly 20 bytes"); + +extern USBD_HandleTypeDef hUsbDeviceFS; + +static uint8_t IsPressed(GPIO_TypeDef *port, uint16_t pin) +{ + return (HAL_GPIO_ReadPin(port, pin) == GPIO_PIN_RESET) ? 1U : 0U; +} + +void XInput_AppProcess(void) +{ + XInputReport report = {0}; + + report.reportId = 0x00U; + report.reportSize = sizeof(report); + + if (IsPressed(UP_GPIO_Port, UP_Pin)) + { + report.buttons1 |= (1U << 0); + } + if (IsPressed(DOWN_GPIO_Port, DOWN_Pin)) + { + report.buttons1 |= (1U << 1); + } + if (IsPressed(LEFT_GPIO_Port, LEFT_Pin)) + { + report.buttons1 |= (1U << 2); + } + if (IsPressed(RIGHT_GPIO_Port, RIGHT_Pin)) + { + report.buttons1 |= (1U << 3); + } + if (IsPressed(Start_GPIO_Port, Start_Pin)) + { + report.buttons1 |= (1U << 4); + } + if (IsPressed(Select_GPIO_Port, Select_Pin)) + { + report.buttons1 |= (1U << 5); + } + + if (IsPressed(LB_GPIO_Port, LB_Pin)) + { + report.buttons2 |= (1U << 0); + } + if (IsPressed(RB_GPIO_Port, RB_Pin)) + { + report.buttons2 |= (1U << 1); + } + if (IsPressed(A_GPIO_Port, A_Pin)) + { + report.buttons2 |= (1U << 4); + } + if (IsPressed(B_GPIO_Port, B_Pin)) + { + report.buttons2 |= (1U << 5); + } + if (IsPressed(X_GPIO_Port, X_Pin)) + { + report.buttons2 |= (1U << 6); + } + if (IsPressed(Y_GPIO_Port, Y_Pin)) + { + report.buttons2 |= (1U << 7); + } + + report.leftTrigger = IsPressed(LT_GPIO_Port, LT_Pin) ? 0xFFU : 0x00U; + report.rightTrigger = IsPressed(RT_GPIO_Port, RT_Pin) ? 0xFFU : 0x00U; + + (void)USBD_XINPUT_SendReport(&hUsbDeviceFS, + (uint8_t *)&report, + sizeof(report)); +} diff --git a/arcadestick_software/DFU.md b/arcadestick_software/DFU.md new file mode 100644 index 0000000..2d1d4c6 --- /dev/null +++ b/arcadestick_software/DFU.md @@ -0,0 +1,36 @@ +# Refleks Lite Bootloader and DFU Guide + +## Flash layout + +| Region | Start address | Size | USB identity | +| --- | ---: | ---: | --- | +| Bootloader / DFU | `0x08000000` | 24 KB | `1209:E667` | +| App1 / XInput | `0x08006000` | 52 KB | `1209:E668` | +| App2 / DInput | `0x08013000` | 52 KB | `1209:E669` | + +For initial programming, flash `build/Release/arcadestick_full.hex` with an +ST-Link. This file contains the bootloader and both applications. + +## Boot selection + +- Hold `START` during reset to keep the device in DFU mode. +- When `PA4` is LOW, the bootloader starts XInput App1. +- When `PA5` is LOW, the bootloader starts DInput App2. +- If the selection is invalid, or the selected application's vector table is + invalid, the bootloader remains in DFU mode. + +## Updating over USB + +The bootloader implements standard USB DFU 1.1. It does not use DfuSe address +commands; the alternate interface number selects the destination slot. + +```powershell +# XInput App1 +dfu-util -d 1209:e667 -a 0 -D build/Release/arcadestick_xinput.bin + +# DInput App2 +dfu-util -d 1209:e667 -a 1 -D build/Release/arcadestick.bin +``` + +On Windows, the `1209:E667` device must use the WinUSB driver. `dfu-util` is +not currently installed in this computer's `PATH`. diff --git a/arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h b/arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h new file mode 100644 index 0000000..82df4b0 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xb.h @@ -0,0 +1,10240 @@ +/** + ****************************************************************************** + * @file stm32f103xb.h + * @author MCD Application Team + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM32F1xx devices. + * + * This file contains: + * - Data structures and the address mapping for all peripherals + * - Peripheral's registers declarations and bits definition + * - Macros to access peripheral's registers hardware + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017-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. + * + ****************************************************************************** + */ + + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f103xb + * @{ + */ + +#ifndef __STM32F103xB_H +#define __STM32F103xB_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#define __CM3_REV 0x0200U /*!< Core Revision r2p0 */ + #define __MPU_PRESENT 0U /*!< Other STM32 devices does not provide an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32 uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F10x Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ + + /*!< Interrupt Number Definition */ +typedef enum +{ +/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Cortex-M3 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + +/****** STM32 specific Interrupt Numbers *********************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + 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_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ + USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ + 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_IRQn = 24, /*!< TIM1 Break Interrupt */ + TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */ + TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation 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 through EXTI Line Interrupt */ + USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f1xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SMPR1; + __IO uint32_t SMPR2; + __IO uint32_t JOFR1; + __IO uint32_t JOFR2; + __IO uint32_t JOFR3; + __IO uint32_t JOFR4; + __IO uint32_t HTR; + __IO uint32_t LTR; + __IO uint32_t SQR1; + __IO uint32_t SQR2; + __IO uint32_t SQR3; + __IO uint32_t JSQR; + __IO uint32_t JDR1; + __IO uint32_t JDR2; + __IO uint32_t JDR3; + __IO uint32_t JDR4; + __IO uint32_t DR; +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address */ + __IO uint32_t CR1; /*!< ADC control register 1, used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address + 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address + 0x08 */ + uint32_t RESERVED[16]; + __IO uint32_t DR; /*!< ADC data register, used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address + 0x4C */ +} ADC_Common_TypeDef; + +/** + * @brief Backup Registers + */ + +typedef struct +{ + uint32_t RESERVED0; + __IO uint32_t DR1; + __IO uint32_t DR2; + __IO uint32_t DR3; + __IO uint32_t DR4; + __IO uint32_t DR5; + __IO uint32_t DR6; + __IO uint32_t DR7; + __IO uint32_t DR8; + __IO uint32_t DR9; + __IO uint32_t DR10; + __IO uint32_t RTCCR; + __IO uint32_t CR; + __IO uint32_t CSR; +} BKP_TypeDef; + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; + __IO uint32_t TDTR; + __IO uint32_t TDLR; + __IO uint32_t TDHR; +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; + __IO uint32_t RDTR; + __IO uint32_t RDLR; + __IO uint32_t RDHR; +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; + __IO uint32_t FR2; +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; + __IO uint32_t MSR; + __IO uint32_t TSR; + __IO uint32_t RF0R; + __IO uint32_t RF1R; + __IO uint32_t IER; + __IO uint32_t ESR; + __IO uint32_t BTR; + uint32_t RESERVED0[88]; + CAN_TxMailBox_TypeDef sTxMailBox[3]; + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; + uint32_t RESERVED1[12]; + __IO uint32_t FMR; + __IO uint32_t FM1R; + uint32_t RESERVED2; + __IO uint32_t FS1R; + uint32_t RESERVED3; + __IO uint32_t FFA1R; + uint32_t RESERVED4; + __IO uint32_t FA1R; + uint32_t RESERVED5[8]; + CAN_FilterRegister_TypeDef sFilterRegister[14]; +} 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, Address offset: 0x05 */ + uint16_t RESERVED1; /*!< Reserved, Address offset: 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; + __IO uint32_t CR; +}DBGMCU_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CCR; + __IO uint32_t CNDTR; + __IO uint32_t CPAR; + __IO uint32_t CMAR; +} DMA_Channel_TypeDef; + +typedef struct +{ + __IO uint32_t ISR; + __IO uint32_t IFCR; +} DMA_TypeDef; + + + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; + __IO uint32_t EMR; + __IO uint32_t RTSR; + __IO uint32_t FTSR; + __IO uint32_t SWIER; + __IO uint32_t PR; +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; + __IO uint32_t KEYR; + __IO uint32_t OPTKEYR; + __IO uint32_t SR; + __IO uint32_t CR; + __IO uint32_t AR; + __IO uint32_t RESERVED; + __IO uint32_t OBR; + __IO uint32_t WRPR; +} FLASH_TypeDef; + +/** + * @brief Option Bytes Registers + */ + +typedef struct +{ + __IO uint16_t RDP; + __IO uint16_t USER; + __IO uint16_t Data0; + __IO uint16_t Data1; + __IO uint16_t WRP0; + __IO uint16_t WRP1; + __IO uint16_t WRP2; + __IO uint16_t WRP3; +} OB_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t CRL; + __IO uint32_t CRH; + __IO uint32_t IDR; + __IO uint32_t ODR; + __IO uint32_t BSRR; + __IO uint32_t BRR; + __IO uint32_t LCKR; +} GPIO_TypeDef; + +/** + * @brief Alternate Function I/O + */ + +typedef struct +{ + __IO uint32_t EVCR; + __IO uint32_t MAPR; + __IO uint32_t EXTICR[4]; + uint32_t RESERVED0; + __IO uint32_t MAPR2; +} AFIO_TypeDef; +/** + * @brief Inter Integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t OAR1; + __IO uint32_t OAR2; + __IO uint32_t DR; + __IO uint32_t SR1; + __IO uint32_t SR2; + __IO uint32_t CCR; + __IO uint32_t TRISE; +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CSR; +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; + __IO uint32_t CFGR; + __IO uint32_t CIR; + __IO uint32_t APB2RSTR; + __IO uint32_t APB1RSTR; + __IO uint32_t AHBENR; + __IO uint32_t APB2ENR; + __IO uint32_t APB1ENR; + __IO uint32_t BDCR; + __IO uint32_t CSR; + + +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t CRH; + __IO uint32_t CRL; + __IO uint32_t PRLH; + __IO uint32_t PRLL; + __IO uint32_t DIVH; + __IO uint32_t DIVL; + __IO uint32_t CNTH; + __IO uint32_t CNTL; + __IO uint32_t ALRH; + __IO uint32_t ALRL; +} RTC_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; + __IO uint32_t CR2; + __IO uint32_t SR; + __IO uint32_t DR; + __IO uint32_t CRCPR; + __IO uint32_t RXCRCR; + __IO uint32_t TXCRCR; + __IO uint32_t I2SCFGR; +} SPI_TypeDef; + +/** + * @brief TIM Timers + */ +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 register, 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 register, 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 Universal Serial Bus Full Speed Device + */ + +typedef struct +{ + __IO uint16_t EP0R; /*!< USB Endpoint 0 register, Address offset: 0x00 */ + __IO uint16_t RESERVED0; /*!< Reserved */ + __IO uint16_t EP1R; /*!< USB Endpoint 1 register, Address offset: 0x04 */ + __IO uint16_t RESERVED1; /*!< Reserved */ + __IO uint16_t EP2R; /*!< USB Endpoint 2 register, Address offset: 0x08 */ + __IO uint16_t RESERVED2; /*!< Reserved */ + __IO uint16_t EP3R; /*!< USB Endpoint 3 register, Address offset: 0x0C */ + __IO uint16_t RESERVED3; /*!< Reserved */ + __IO uint16_t EP4R; /*!< USB Endpoint 4 register, Address offset: 0x10 */ + __IO uint16_t RESERVED4; /*!< Reserved */ + __IO uint16_t EP5R; /*!< USB Endpoint 5 register, Address offset: 0x14 */ + __IO uint16_t RESERVED5; /*!< Reserved */ + __IO uint16_t EP6R; /*!< USB Endpoint 6 register, Address offset: 0x18 */ + __IO uint16_t RESERVED6; /*!< Reserved */ + __IO uint16_t EP7R; /*!< USB Endpoint 7 register, Address offset: 0x1C */ + __IO uint16_t RESERVED7[17]; /*!< Reserved */ + __IO uint16_t CNTR; /*!< Control register, Address offset: 0x40 */ + __IO uint16_t RESERVED8; /*!< Reserved */ + __IO uint16_t ISTR; /*!< Interrupt status register, Address offset: 0x44 */ + __IO uint16_t RESERVED9; /*!< Reserved */ + __IO uint16_t FNR; /*!< Frame number register, Address offset: 0x48 */ + __IO uint16_t RESERVEDA; /*!< Reserved */ + __IO uint16_t DADDR; /*!< Device address register, Address offset: 0x4C */ + __IO uint16_t RESERVEDB; /*!< Reserved */ + __IO uint16_t BTABLE; /*!< Buffer Table address register, Address offset: 0x50 */ + __IO uint16_t RESERVEDC; /*!< Reserved */ +} USB_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; + +/** + * @} + */ + +/** @addtogroup Peripheral_memory_map + * @{ + */ + + +#define FLASH_BASE 0x08000000UL /*!< FLASH base address in the alias region */ +#define FLASH_BANK1_END 0x0801FFFFUL /*!< FLASH END address of bank1 */ +#define SRAM_BASE 0x20000000UL /*!< SRAM base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ + +#define SRAM_BB_BASE 0x22000000UL /*!< SRAM base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ + + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL) + +#define TIM2_BASE (APB1PERIPH_BASE + 0x00000000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x00000400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x00000800UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x00002800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x00002C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x00003000UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x00003800UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x00004400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x00004800UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x00005400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x00005800UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x00006400UL) +#define BKP_BASE (APB1PERIPH_BASE + 0x00006C00UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x00007000UL) +#define AFIO_BASE (APB2PERIPH_BASE + 0x00000000UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x00000400UL) +#define GPIOA_BASE (APB2PERIPH_BASE + 0x00000800UL) +#define GPIOB_BASE (APB2PERIPH_BASE + 0x00000C00UL) +#define GPIOC_BASE (APB2PERIPH_BASE + 0x00001000UL) +#define GPIOD_BASE (APB2PERIPH_BASE + 0x00001400UL) +#define GPIOE_BASE (APB2PERIPH_BASE + 0x00001800UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x00002400UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x00002800UL) +#define TIM1_BASE (APB2PERIPH_BASE + 0x00002C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x00003000UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x00003800UL) + + +#define DMA1_BASE (AHBPERIPH_BASE + 0x00000000UL) +#define DMA1_Channel1_BASE (AHBPERIPH_BASE + 0x00000008UL) +#define DMA1_Channel2_BASE (AHBPERIPH_BASE + 0x0000001CUL) +#define DMA1_Channel3_BASE (AHBPERIPH_BASE + 0x00000030UL) +#define DMA1_Channel4_BASE (AHBPERIPH_BASE + 0x00000044UL) +#define DMA1_Channel5_BASE (AHBPERIPH_BASE + 0x00000058UL) +#define DMA1_Channel6_BASE (AHBPERIPH_BASE + 0x0000006CUL) +#define DMA1_Channel7_BASE (AHBPERIPH_BASE + 0x00000080UL) +#define RCC_BASE (AHBPERIPH_BASE + 0x00001000UL) +#define CRC_BASE (AHBPERIPH_BASE + 0x00003000UL) + +#define FLASH_R_BASE (AHBPERIPH_BASE + 0x00002000UL) /*!< Flash registers base address */ +#define FLASHSIZE_BASE 0x1FFFF7E0UL /*!< FLASH Size register base address */ +#define UID_BASE 0x1FFFF7E8UL /*!< Unique device ID register base address */ +#define OB_BASE 0x1FFFF800UL /*!< Flash Option Bytes base address */ + + + +#define DBGMCU_BASE 0xE0042000UL /*!< Debug MCU registers base address */ + +/* USB device FS */ +#define USB_BASE (APB1PERIPH_BASE + 0x00005C00UL) /*!< USB_IP Peripheral Registers base address */ +#define USB_PMAADDR (APB1PERIPH_BASE + 0x00006000UL) /*!< USB_IP Packet Memory Area base address */ + + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ + +#define TIM2 ((TIM_TypeDef *)TIM2_BASE) +#define TIM3 ((TIM_TypeDef *)TIM3_BASE) +#define TIM4 ((TIM_TypeDef *)TIM4_BASE) +#define RTC ((RTC_TypeDef *)RTC_BASE) +#define WWDG ((WWDG_TypeDef *)WWDG_BASE) +#define IWDG ((IWDG_TypeDef *)IWDG_BASE) +#define SPI2 ((SPI_TypeDef *)SPI2_BASE) +#define USART2 ((USART_TypeDef *)USART2_BASE) +#define USART3 ((USART_TypeDef *)USART3_BASE) +#define I2C1 ((I2C_TypeDef *)I2C1_BASE) +#define I2C2 ((I2C_TypeDef *)I2C2_BASE) +#define USB ((USB_TypeDef *)USB_BASE) +#define CAN1 ((CAN_TypeDef *)CAN1_BASE) +#define BKP ((BKP_TypeDef *)BKP_BASE) +#define PWR ((PWR_TypeDef *)PWR_BASE) +#define AFIO ((AFIO_TypeDef *)AFIO_BASE) +#define EXTI ((EXTI_TypeDef *)EXTI_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 ADC1 ((ADC_TypeDef *)ADC1_BASE) +#define ADC2 ((ADC_TypeDef *)ADC2_BASE) +#define ADC12_COMMON ((ADC_Common_TypeDef *)ADC1_BASE) +#define TIM1 ((TIM_TypeDef *)TIM1_BASE) +#define SPI1 ((SPI_TypeDef *)SPI1_BASE) +#define USART1 ((USART_TypeDef *)USART1_BASE) +#define DMA1 ((DMA_TypeDef *)DMA1_BASE) +#define DMA1_Channel1 ((DMA_Channel_TypeDef *)DMA1_Channel1_BASE) +#define DMA1_Channel2 ((DMA_Channel_TypeDef *)DMA1_Channel2_BASE) +#define DMA1_Channel3 ((DMA_Channel_TypeDef *)DMA1_Channel3_BASE) +#define DMA1_Channel4 ((DMA_Channel_TypeDef *)DMA1_Channel4_BASE) +#define DMA1_Channel5 ((DMA_Channel_TypeDef *)DMA1_Channel5_BASE) +#define DMA1_Channel6 ((DMA_Channel_TypeDef *)DMA1_Channel6_BASE) +#define DMA1_Channel7 ((DMA_Channel_TypeDef *)DMA1_Channel7_BASE) +#define RCC ((RCC_TypeDef *)RCC_BASE) +#define CRC ((CRC_TypeDef *)CRC_BASE) +#define FLASH ((FLASH_TypeDef *)FLASH_R_BASE) +#define OB ((OB_TypeDef *)OB_BASE) +#define DBGMCU ((DBGMCU_TypeDef *)DBGMCU_BASE) + + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Hardware_Constant_Definition + * @{ + */ +#define LSI_STARTUP_TIME 85U /*!< LSI Maximum startup time in us */ + /** + * @} + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* CRC calculation unit (CRC) */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for CRC_DR register *********************/ +#define CRC_DR_DR_Pos (0U) +#define CRC_DR_DR_Msk (0xFFFFFFFFUL << CRC_DR_DR_Pos) /*!< 0xFFFFFFFF */ +#define CRC_DR_DR CRC_DR_DR_Msk /*!< Data register bits */ + +/******************* Bit definition for CRC_IDR register ********************/ +#define CRC_IDR_IDR_Pos (0U) +#define CRC_IDR_IDR_Msk (0xFFUL << CRC_IDR_IDR_Pos) /*!< 0x000000FF */ +#define CRC_IDR_IDR CRC_IDR_IDR_Msk /*!< General-purpose 8-bit data register bits */ + +/******************** Bit definition for CRC_CR register ********************/ +#define CRC_CR_RESET_Pos (0U) +#define CRC_CR_RESET_Msk (0x1UL << CRC_CR_RESET_Pos) /*!< 0x00000001 */ +#define CRC_CR_RESET CRC_CR_RESET_Msk /*!< RESET bit */ + +/******************************************************************************/ +/* */ +/* Power Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for PWR_CR register ********************/ +#define PWR_CR_LPDS_Pos (0U) +#define PWR_CR_LPDS_Msk (0x1UL << PWR_CR_LPDS_Pos) /*!< 0x00000001 */ +#define PWR_CR_LPDS PWR_CR_LPDS_Msk /*!< Low-Power Deepsleep */ +#define PWR_CR_PDDS_Pos (1U) +#define PWR_CR_PDDS_Msk (0x1UL << PWR_CR_PDDS_Pos) /*!< 0x00000002 */ +#define PWR_CR_PDDS PWR_CR_PDDS_Msk /*!< Power Down Deepsleep */ +#define PWR_CR_CWUF_Pos (2U) +#define PWR_CR_CWUF_Msk (0x1UL << PWR_CR_CWUF_Pos) /*!< 0x00000004 */ +#define PWR_CR_CWUF PWR_CR_CWUF_Msk /*!< Clear Wakeup Flag */ +#define PWR_CR_CSBF_Pos (3U) +#define PWR_CR_CSBF_Msk (0x1UL << PWR_CR_CSBF_Pos) /*!< 0x00000008 */ +#define PWR_CR_CSBF PWR_CR_CSBF_Msk /*!< Clear Standby Flag */ +#define PWR_CR_PVDE_Pos (4U) +#define PWR_CR_PVDE_Msk (0x1UL << PWR_CR_PVDE_Pos) /*!< 0x00000010 */ +#define PWR_CR_PVDE PWR_CR_PVDE_Msk /*!< Power Voltage Detector Enable */ + +#define PWR_CR_PLS_Pos (5U) +#define PWR_CR_PLS_Msk (0x7UL << PWR_CR_PLS_Pos) /*!< 0x000000E0 */ +#define PWR_CR_PLS PWR_CR_PLS_Msk /*!< PLS[2:0] bits (PVD Level Selection) */ +#define PWR_CR_PLS_0 (0x1UL << PWR_CR_PLS_Pos) /*!< 0x00000020 */ +#define PWR_CR_PLS_1 (0x2UL << PWR_CR_PLS_Pos) /*!< 0x00000040 */ +#define PWR_CR_PLS_2 (0x4UL << PWR_CR_PLS_Pos) /*!< 0x00000080 */ + +/*!< PVD level configuration */ +#define PWR_CR_PLS_LEV0 0x00000000U /*!< PVD level 2.2V */ +#define PWR_CR_PLS_LEV1 0x00000020U /*!< PVD level 2.3V */ +#define PWR_CR_PLS_LEV2 0x00000040U /*!< PVD level 2.4V */ +#define PWR_CR_PLS_LEV3 0x00000060U /*!< PVD level 2.5V */ +#define PWR_CR_PLS_LEV4 0x00000080U /*!< PVD level 2.6V */ +#define PWR_CR_PLS_LEV5 0x000000A0U /*!< PVD level 2.7V */ +#define PWR_CR_PLS_LEV6 0x000000C0U /*!< PVD level 2.8V */ +#define PWR_CR_PLS_LEV7 0x000000E0U /*!< PVD level 2.9V */ + +/* Legacy defines */ +#define PWR_CR_PLS_2V2 PWR_CR_PLS_LEV0 +#define PWR_CR_PLS_2V3 PWR_CR_PLS_LEV1 +#define PWR_CR_PLS_2V4 PWR_CR_PLS_LEV2 +#define PWR_CR_PLS_2V5 PWR_CR_PLS_LEV3 +#define PWR_CR_PLS_2V6 PWR_CR_PLS_LEV4 +#define PWR_CR_PLS_2V7 PWR_CR_PLS_LEV5 +#define PWR_CR_PLS_2V8 PWR_CR_PLS_LEV6 +#define PWR_CR_PLS_2V9 PWR_CR_PLS_LEV7 + +#define PWR_CR_DBP_Pos (8U) +#define PWR_CR_DBP_Msk (0x1UL << PWR_CR_DBP_Pos) /*!< 0x00000100 */ +#define PWR_CR_DBP PWR_CR_DBP_Msk /*!< Disable Backup Domain write protection */ + + +/******************* Bit definition for PWR_CSR register ********************/ +#define PWR_CSR_WUF_Pos (0U) +#define PWR_CSR_WUF_Msk (0x1UL << PWR_CSR_WUF_Pos) /*!< 0x00000001 */ +#define PWR_CSR_WUF PWR_CSR_WUF_Msk /*!< Wakeup Flag */ +#define PWR_CSR_SBF_Pos (1U) +#define PWR_CSR_SBF_Msk (0x1UL << PWR_CSR_SBF_Pos) /*!< 0x00000002 */ +#define PWR_CSR_SBF PWR_CSR_SBF_Msk /*!< Standby Flag */ +#define PWR_CSR_PVDO_Pos (2U) +#define PWR_CSR_PVDO_Msk (0x1UL << PWR_CSR_PVDO_Pos) /*!< 0x00000004 */ +#define PWR_CSR_PVDO PWR_CSR_PVDO_Msk /*!< PVD Output */ +#define PWR_CSR_EWUP_Pos (8U) +#define PWR_CSR_EWUP_Msk (0x1UL << PWR_CSR_EWUP_Pos) /*!< 0x00000100 */ +#define PWR_CSR_EWUP PWR_CSR_EWUP_Msk /*!< Enable WKUP pin */ + +/******************************************************************************/ +/* */ +/* Backup registers */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for BKP_DR1 register ********************/ +#define BKP_DR1_D_Pos (0U) +#define BKP_DR1_D_Msk (0xFFFFUL << BKP_DR1_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR1_D BKP_DR1_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR2 register ********************/ +#define BKP_DR2_D_Pos (0U) +#define BKP_DR2_D_Msk (0xFFFFUL << BKP_DR2_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR2_D BKP_DR2_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR3 register ********************/ +#define BKP_DR3_D_Pos (0U) +#define BKP_DR3_D_Msk (0xFFFFUL << BKP_DR3_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR3_D BKP_DR3_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR4 register ********************/ +#define BKP_DR4_D_Pos (0U) +#define BKP_DR4_D_Msk (0xFFFFUL << BKP_DR4_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR4_D BKP_DR4_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR5 register ********************/ +#define BKP_DR5_D_Pos (0U) +#define BKP_DR5_D_Msk (0xFFFFUL << BKP_DR5_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR5_D BKP_DR5_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR6 register ********************/ +#define BKP_DR6_D_Pos (0U) +#define BKP_DR6_D_Msk (0xFFFFUL << BKP_DR6_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR6_D BKP_DR6_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR7 register ********************/ +#define BKP_DR7_D_Pos (0U) +#define BKP_DR7_D_Msk (0xFFFFUL << BKP_DR7_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR7_D BKP_DR7_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR8 register ********************/ +#define BKP_DR8_D_Pos (0U) +#define BKP_DR8_D_Msk (0xFFFFUL << BKP_DR8_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR8_D BKP_DR8_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR9 register ********************/ +#define BKP_DR9_D_Pos (0U) +#define BKP_DR9_D_Msk (0xFFFFUL << BKP_DR9_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR9_D BKP_DR9_D_Msk /*!< Backup data */ + +/******************* Bit definition for BKP_DR10 register *******************/ +#define BKP_DR10_D_Pos (0U) +#define BKP_DR10_D_Msk (0xFFFFUL << BKP_DR10_D_Pos) /*!< 0x0000FFFF */ +#define BKP_DR10_D BKP_DR10_D_Msk /*!< Backup data */ + +#define RTC_BKP_NUMBER 10 + +/****************** Bit definition for BKP_RTCCR register *******************/ +#define BKP_RTCCR_CAL_Pos (0U) +#define BKP_RTCCR_CAL_Msk (0x7FUL << BKP_RTCCR_CAL_Pos) /*!< 0x0000007F */ +#define BKP_RTCCR_CAL BKP_RTCCR_CAL_Msk /*!< Calibration value */ +#define BKP_RTCCR_CCO_Pos (7U) +#define BKP_RTCCR_CCO_Msk (0x1UL << BKP_RTCCR_CCO_Pos) /*!< 0x00000080 */ +#define BKP_RTCCR_CCO BKP_RTCCR_CCO_Msk /*!< Calibration Clock Output */ +#define BKP_RTCCR_ASOE_Pos (8U) +#define BKP_RTCCR_ASOE_Msk (0x1UL << BKP_RTCCR_ASOE_Pos) /*!< 0x00000100 */ +#define BKP_RTCCR_ASOE BKP_RTCCR_ASOE_Msk /*!< Alarm or Second Output Enable */ +#define BKP_RTCCR_ASOS_Pos (9U) +#define BKP_RTCCR_ASOS_Msk (0x1UL << BKP_RTCCR_ASOS_Pos) /*!< 0x00000200 */ +#define BKP_RTCCR_ASOS BKP_RTCCR_ASOS_Msk /*!< Alarm or Second Output Selection */ + +/******************** Bit definition for BKP_CR register ********************/ +#define BKP_CR_TPE_Pos (0U) +#define BKP_CR_TPE_Msk (0x1UL << BKP_CR_TPE_Pos) /*!< 0x00000001 */ +#define BKP_CR_TPE BKP_CR_TPE_Msk /*!< TAMPER pin enable */ +#define BKP_CR_TPAL_Pos (1U) +#define BKP_CR_TPAL_Msk (0x1UL << BKP_CR_TPAL_Pos) /*!< 0x00000002 */ +#define BKP_CR_TPAL BKP_CR_TPAL_Msk /*!< TAMPER pin active level */ + +/******************* Bit definition for BKP_CSR register ********************/ +#define BKP_CSR_CTE_Pos (0U) +#define BKP_CSR_CTE_Msk (0x1UL << BKP_CSR_CTE_Pos) /*!< 0x00000001 */ +#define BKP_CSR_CTE BKP_CSR_CTE_Msk /*!< Clear Tamper event */ +#define BKP_CSR_CTI_Pos (1U) +#define BKP_CSR_CTI_Msk (0x1UL << BKP_CSR_CTI_Pos) /*!< 0x00000002 */ +#define BKP_CSR_CTI BKP_CSR_CTI_Msk /*!< Clear Tamper Interrupt */ +#define BKP_CSR_TPIE_Pos (2U) +#define BKP_CSR_TPIE_Msk (0x1UL << BKP_CSR_TPIE_Pos) /*!< 0x00000004 */ +#define BKP_CSR_TPIE BKP_CSR_TPIE_Msk /*!< TAMPER Pin interrupt enable */ +#define BKP_CSR_TEF_Pos (8U) +#define BKP_CSR_TEF_Msk (0x1UL << BKP_CSR_TEF_Pos) /*!< 0x00000100 */ +#define BKP_CSR_TEF BKP_CSR_TEF_Msk /*!< Tamper Event Flag */ +#define BKP_CSR_TIF_Pos (9U) +#define BKP_CSR_TIF_Msk (0x1UL << BKP_CSR_TIF_Pos) /*!< 0x00000200 */ +#define BKP_CSR_TIF BKP_CSR_TIF_Msk /*!< Tamper Interrupt Flag */ + +/******************************************************************************/ +/* */ +/* Reset and Clock Control */ +/* */ +/******************************************************************************/ + +/******************** Bit definition for RCC_CR register ********************/ +#define RCC_CR_HSION_Pos (0U) +#define RCC_CR_HSION_Msk (0x1UL << RCC_CR_HSION_Pos) /*!< 0x00000001 */ +#define RCC_CR_HSION RCC_CR_HSION_Msk /*!< Internal High Speed clock enable */ +#define RCC_CR_HSIRDY_Pos (1U) +#define RCC_CR_HSIRDY_Msk (0x1UL << RCC_CR_HSIRDY_Pos) /*!< 0x00000002 */ +#define RCC_CR_HSIRDY RCC_CR_HSIRDY_Msk /*!< Internal High Speed clock ready flag */ +#define RCC_CR_HSITRIM_Pos (3U) +#define RCC_CR_HSITRIM_Msk (0x1FUL << RCC_CR_HSITRIM_Pos) /*!< 0x000000F8 */ +#define RCC_CR_HSITRIM RCC_CR_HSITRIM_Msk /*!< Internal High Speed clock trimming */ +#define RCC_CR_HSICAL_Pos (8U) +#define RCC_CR_HSICAL_Msk (0xFFUL << RCC_CR_HSICAL_Pos) /*!< 0x0000FF00 */ +#define RCC_CR_HSICAL RCC_CR_HSICAL_Msk /*!< Internal High Speed clock Calibration */ +#define RCC_CR_HSEON_Pos (16U) +#define RCC_CR_HSEON_Msk (0x1UL << RCC_CR_HSEON_Pos) /*!< 0x00010000 */ +#define RCC_CR_HSEON RCC_CR_HSEON_Msk /*!< External High Speed clock enable */ +#define RCC_CR_HSERDY_Pos (17U) +#define RCC_CR_HSERDY_Msk (0x1UL << RCC_CR_HSERDY_Pos) /*!< 0x00020000 */ +#define RCC_CR_HSERDY RCC_CR_HSERDY_Msk /*!< External High Speed clock ready flag */ +#define RCC_CR_HSEBYP_Pos (18U) +#define RCC_CR_HSEBYP_Msk (0x1UL << RCC_CR_HSEBYP_Pos) /*!< 0x00040000 */ +#define RCC_CR_HSEBYP RCC_CR_HSEBYP_Msk /*!< External High Speed clock Bypass */ +#define RCC_CR_CSSON_Pos (19U) +#define RCC_CR_CSSON_Msk (0x1UL << RCC_CR_CSSON_Pos) /*!< 0x00080000 */ +#define RCC_CR_CSSON RCC_CR_CSSON_Msk /*!< Clock Security System enable */ +#define RCC_CR_PLLON_Pos (24U) +#define RCC_CR_PLLON_Msk (0x1UL << RCC_CR_PLLON_Pos) /*!< 0x01000000 */ +#define RCC_CR_PLLON RCC_CR_PLLON_Msk /*!< PLL enable */ +#define RCC_CR_PLLRDY_Pos (25U) +#define RCC_CR_PLLRDY_Msk (0x1UL << RCC_CR_PLLRDY_Pos) /*!< 0x02000000 */ +#define RCC_CR_PLLRDY RCC_CR_PLLRDY_Msk /*!< PLL clock ready flag */ + + +/******************* Bit definition for RCC_CFGR register *******************/ +/*!< SW configuration */ +#define RCC_CFGR_SW_Pos (0U) +#define RCC_CFGR_SW_Msk (0x3UL << RCC_CFGR_SW_Pos) /*!< 0x00000003 */ +#define RCC_CFGR_SW RCC_CFGR_SW_Msk /*!< SW[1:0] bits (System clock Switch) */ +#define RCC_CFGR_SW_0 (0x1UL << RCC_CFGR_SW_Pos) /*!< 0x00000001 */ +#define RCC_CFGR_SW_1 (0x2UL << RCC_CFGR_SW_Pos) /*!< 0x00000002 */ + +#define RCC_CFGR_SW_HSI 0x00000000U /*!< HSI selected as system clock */ +#define RCC_CFGR_SW_HSE 0x00000001U /*!< HSE selected as system clock */ +#define RCC_CFGR_SW_PLL 0x00000002U /*!< PLL selected as system clock */ + +/*!< SWS configuration */ +#define RCC_CFGR_SWS_Pos (2U) +#define RCC_CFGR_SWS_Msk (0x3UL << RCC_CFGR_SWS_Pos) /*!< 0x0000000C */ +#define RCC_CFGR_SWS RCC_CFGR_SWS_Msk /*!< SWS[1:0] bits (System Clock Switch Status) */ +#define RCC_CFGR_SWS_0 (0x1UL << RCC_CFGR_SWS_Pos) /*!< 0x00000004 */ +#define RCC_CFGR_SWS_1 (0x2UL << RCC_CFGR_SWS_Pos) /*!< 0x00000008 */ + +#define RCC_CFGR_SWS_HSI 0x00000000U /*!< HSI oscillator used as system clock */ +#define RCC_CFGR_SWS_HSE 0x00000004U /*!< HSE oscillator used as system clock */ +#define RCC_CFGR_SWS_PLL 0x00000008U /*!< PLL used as system clock */ + +/*!< HPRE configuration */ +#define RCC_CFGR_HPRE_Pos (4U) +#define RCC_CFGR_HPRE_Msk (0xFUL << RCC_CFGR_HPRE_Pos) /*!< 0x000000F0 */ +#define RCC_CFGR_HPRE RCC_CFGR_HPRE_Msk /*!< HPRE[3:0] bits (AHB prescaler) */ +#define RCC_CFGR_HPRE_0 (0x1UL << RCC_CFGR_HPRE_Pos) /*!< 0x00000010 */ +#define RCC_CFGR_HPRE_1 (0x2UL << RCC_CFGR_HPRE_Pos) /*!< 0x00000020 */ +#define RCC_CFGR_HPRE_2 (0x4UL << RCC_CFGR_HPRE_Pos) /*!< 0x00000040 */ +#define RCC_CFGR_HPRE_3 (0x8UL << RCC_CFGR_HPRE_Pos) /*!< 0x00000080 */ + +#define RCC_CFGR_HPRE_DIV1 0x00000000U /*!< SYSCLK not divided */ +#define RCC_CFGR_HPRE_DIV2 0x00000080U /*!< SYSCLK divided by 2 */ +#define RCC_CFGR_HPRE_DIV4 0x00000090U /*!< SYSCLK divided by 4 */ +#define RCC_CFGR_HPRE_DIV8 0x000000A0U /*!< SYSCLK divided by 8 */ +#define RCC_CFGR_HPRE_DIV16 0x000000B0U /*!< SYSCLK divided by 16 */ +#define RCC_CFGR_HPRE_DIV64 0x000000C0U /*!< SYSCLK divided by 64 */ +#define RCC_CFGR_HPRE_DIV128 0x000000D0U /*!< SYSCLK divided by 128 */ +#define RCC_CFGR_HPRE_DIV256 0x000000E0U /*!< SYSCLK divided by 256 */ +#define RCC_CFGR_HPRE_DIV512 0x000000F0U /*!< SYSCLK divided by 512 */ + +/*!< PPRE1 configuration */ +#define RCC_CFGR_PPRE1_Pos (8U) +#define RCC_CFGR_PPRE1_Msk (0x7UL << RCC_CFGR_PPRE1_Pos) /*!< 0x00000700 */ +#define RCC_CFGR_PPRE1 RCC_CFGR_PPRE1_Msk /*!< PRE1[2:0] bits (APB1 prescaler) */ +#define RCC_CFGR_PPRE1_0 (0x1UL << RCC_CFGR_PPRE1_Pos) /*!< 0x00000100 */ +#define RCC_CFGR_PPRE1_1 (0x2UL << RCC_CFGR_PPRE1_Pos) /*!< 0x00000200 */ +#define RCC_CFGR_PPRE1_2 (0x4UL << RCC_CFGR_PPRE1_Pos) /*!< 0x00000400 */ + +#define RCC_CFGR_PPRE1_DIV1 0x00000000U /*!< HCLK not divided */ +#define RCC_CFGR_PPRE1_DIV2 0x00000400U /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE1_DIV4 0x00000500U /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE1_DIV8 0x00000600U /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE1_DIV16 0x00000700U /*!< HCLK divided by 16 */ + +/*!< PPRE2 configuration */ +#define RCC_CFGR_PPRE2_Pos (11U) +#define RCC_CFGR_PPRE2_Msk (0x7UL << RCC_CFGR_PPRE2_Pos) /*!< 0x00003800 */ +#define RCC_CFGR_PPRE2 RCC_CFGR_PPRE2_Msk /*!< PRE2[2:0] bits (APB2 prescaler) */ +#define RCC_CFGR_PPRE2_0 (0x1UL << RCC_CFGR_PPRE2_Pos) /*!< 0x00000800 */ +#define RCC_CFGR_PPRE2_1 (0x2UL << RCC_CFGR_PPRE2_Pos) /*!< 0x00001000 */ +#define RCC_CFGR_PPRE2_2 (0x4UL << RCC_CFGR_PPRE2_Pos) /*!< 0x00002000 */ + +#define RCC_CFGR_PPRE2_DIV1 0x00000000U /*!< HCLK not divided */ +#define RCC_CFGR_PPRE2_DIV2 0x00002000U /*!< HCLK divided by 2 */ +#define RCC_CFGR_PPRE2_DIV4 0x00002800U /*!< HCLK divided by 4 */ +#define RCC_CFGR_PPRE2_DIV8 0x00003000U /*!< HCLK divided by 8 */ +#define RCC_CFGR_PPRE2_DIV16 0x00003800U /*!< HCLK divided by 16 */ + +/*!< ADCPPRE configuration */ +#define RCC_CFGR_ADCPRE_Pos (14U) +#define RCC_CFGR_ADCPRE_Msk (0x3UL << RCC_CFGR_ADCPRE_Pos) /*!< 0x0000C000 */ +#define RCC_CFGR_ADCPRE RCC_CFGR_ADCPRE_Msk /*!< ADCPRE[1:0] bits (ADC prescaler) */ +#define RCC_CFGR_ADCPRE_0 (0x1UL << RCC_CFGR_ADCPRE_Pos) /*!< 0x00004000 */ +#define RCC_CFGR_ADCPRE_1 (0x2UL << RCC_CFGR_ADCPRE_Pos) /*!< 0x00008000 */ + +#define RCC_CFGR_ADCPRE_DIV2 0x00000000U /*!< PCLK2 divided by 2 */ +#define RCC_CFGR_ADCPRE_DIV4 0x00004000U /*!< PCLK2 divided by 4 */ +#define RCC_CFGR_ADCPRE_DIV6 0x00008000U /*!< PCLK2 divided by 6 */ +#define RCC_CFGR_ADCPRE_DIV8 0x0000C000U /*!< PCLK2 divided by 8 */ + +#define RCC_CFGR_PLLSRC_Pos (16U) +#define RCC_CFGR_PLLSRC_Msk (0x1UL << RCC_CFGR_PLLSRC_Pos) /*!< 0x00010000 */ +#define RCC_CFGR_PLLSRC RCC_CFGR_PLLSRC_Msk /*!< PLL entry clock source */ + +#define RCC_CFGR_PLLXTPRE_Pos (17U) +#define RCC_CFGR_PLLXTPRE_Msk (0x1UL << RCC_CFGR_PLLXTPRE_Pos) /*!< 0x00020000 */ +#define RCC_CFGR_PLLXTPRE RCC_CFGR_PLLXTPRE_Msk /*!< HSE divider for PLL entry */ + +/*!< PLLMUL configuration */ +#define RCC_CFGR_PLLMULL_Pos (18U) +#define RCC_CFGR_PLLMULL_Msk (0xFUL << RCC_CFGR_PLLMULL_Pos) /*!< 0x003C0000 */ +#define RCC_CFGR_PLLMULL RCC_CFGR_PLLMULL_Msk /*!< PLLMUL[3:0] bits (PLL multiplication factor) */ +#define RCC_CFGR_PLLMULL_0 (0x1UL << RCC_CFGR_PLLMULL_Pos) /*!< 0x00040000 */ +#define RCC_CFGR_PLLMULL_1 (0x2UL << RCC_CFGR_PLLMULL_Pos) /*!< 0x00080000 */ +#define RCC_CFGR_PLLMULL_2 (0x4UL << RCC_CFGR_PLLMULL_Pos) /*!< 0x00100000 */ +#define RCC_CFGR_PLLMULL_3 (0x8UL << RCC_CFGR_PLLMULL_Pos) /*!< 0x00200000 */ + +#define RCC_CFGR_PLLXTPRE_HSE 0x00000000U /*!< HSE clock not divided for PLL entry */ +#define RCC_CFGR_PLLXTPRE_HSE_DIV2 0x00020000U /*!< HSE clock divided by 2 for PLL entry */ + +#define RCC_CFGR_PLLMULL2 0x00000000U /*!< PLL input clock*2 */ +#define RCC_CFGR_PLLMULL3_Pos (18U) +#define RCC_CFGR_PLLMULL3_Msk (0x1UL << RCC_CFGR_PLLMULL3_Pos) /*!< 0x00040000 */ +#define RCC_CFGR_PLLMULL3 RCC_CFGR_PLLMULL3_Msk /*!< PLL input clock*3 */ +#define RCC_CFGR_PLLMULL4_Pos (19U) +#define RCC_CFGR_PLLMULL4_Msk (0x1UL << RCC_CFGR_PLLMULL4_Pos) /*!< 0x00080000 */ +#define RCC_CFGR_PLLMULL4 RCC_CFGR_PLLMULL4_Msk /*!< PLL input clock*4 */ +#define RCC_CFGR_PLLMULL5_Pos (18U) +#define RCC_CFGR_PLLMULL5_Msk (0x3UL << RCC_CFGR_PLLMULL5_Pos) /*!< 0x000C0000 */ +#define RCC_CFGR_PLLMULL5 RCC_CFGR_PLLMULL5_Msk /*!< PLL input clock*5 */ +#define RCC_CFGR_PLLMULL6_Pos (20U) +#define RCC_CFGR_PLLMULL6_Msk (0x1UL << RCC_CFGR_PLLMULL6_Pos) /*!< 0x00100000 */ +#define RCC_CFGR_PLLMULL6 RCC_CFGR_PLLMULL6_Msk /*!< PLL input clock*6 */ +#define RCC_CFGR_PLLMULL7_Pos (18U) +#define RCC_CFGR_PLLMULL7_Msk (0x5UL << RCC_CFGR_PLLMULL7_Pos) /*!< 0x00140000 */ +#define RCC_CFGR_PLLMULL7 RCC_CFGR_PLLMULL7_Msk /*!< PLL input clock*7 */ +#define RCC_CFGR_PLLMULL8_Pos (19U) +#define RCC_CFGR_PLLMULL8_Msk (0x3UL << RCC_CFGR_PLLMULL8_Pos) /*!< 0x00180000 */ +#define RCC_CFGR_PLLMULL8 RCC_CFGR_PLLMULL8_Msk /*!< PLL input clock*8 */ +#define RCC_CFGR_PLLMULL9_Pos (18U) +#define RCC_CFGR_PLLMULL9_Msk (0x7UL << RCC_CFGR_PLLMULL9_Pos) /*!< 0x001C0000 */ +#define RCC_CFGR_PLLMULL9 RCC_CFGR_PLLMULL9_Msk /*!< PLL input clock*9 */ +#define RCC_CFGR_PLLMULL10_Pos (21U) +#define RCC_CFGR_PLLMULL10_Msk (0x1UL << RCC_CFGR_PLLMULL10_Pos) /*!< 0x00200000 */ +#define RCC_CFGR_PLLMULL10 RCC_CFGR_PLLMULL10_Msk /*!< PLL input clock10 */ +#define RCC_CFGR_PLLMULL11_Pos (18U) +#define RCC_CFGR_PLLMULL11_Msk (0x9UL << RCC_CFGR_PLLMULL11_Pos) /*!< 0x00240000 */ +#define RCC_CFGR_PLLMULL11 RCC_CFGR_PLLMULL11_Msk /*!< PLL input clock*11 */ +#define RCC_CFGR_PLLMULL12_Pos (19U) +#define RCC_CFGR_PLLMULL12_Msk (0x5UL << RCC_CFGR_PLLMULL12_Pos) /*!< 0x00280000 */ +#define RCC_CFGR_PLLMULL12 RCC_CFGR_PLLMULL12_Msk /*!< PLL input clock*12 */ +#define RCC_CFGR_PLLMULL13_Pos (18U) +#define RCC_CFGR_PLLMULL13_Msk (0xBUL << RCC_CFGR_PLLMULL13_Pos) /*!< 0x002C0000 */ +#define RCC_CFGR_PLLMULL13 RCC_CFGR_PLLMULL13_Msk /*!< PLL input clock*13 */ +#define RCC_CFGR_PLLMULL14_Pos (20U) +#define RCC_CFGR_PLLMULL14_Msk (0x3UL << RCC_CFGR_PLLMULL14_Pos) /*!< 0x00300000 */ +#define RCC_CFGR_PLLMULL14 RCC_CFGR_PLLMULL14_Msk /*!< PLL input clock*14 */ +#define RCC_CFGR_PLLMULL15_Pos (18U) +#define RCC_CFGR_PLLMULL15_Msk (0xDUL << RCC_CFGR_PLLMULL15_Pos) /*!< 0x00340000 */ +#define RCC_CFGR_PLLMULL15 RCC_CFGR_PLLMULL15_Msk /*!< PLL input clock*15 */ +#define RCC_CFGR_PLLMULL16_Pos (19U) +#define RCC_CFGR_PLLMULL16_Msk (0x7UL << RCC_CFGR_PLLMULL16_Pos) /*!< 0x00380000 */ +#define RCC_CFGR_PLLMULL16 RCC_CFGR_PLLMULL16_Msk /*!< PLL input clock*16 */ +#define RCC_CFGR_USBPRE_Pos (22U) +#define RCC_CFGR_USBPRE_Msk (0x1UL << RCC_CFGR_USBPRE_Pos) /*!< 0x00400000 */ +#define RCC_CFGR_USBPRE RCC_CFGR_USBPRE_Msk /*!< USB Device prescaler */ + +/*!< MCO configuration */ +#define RCC_CFGR_MCO_Pos (24U) +#define RCC_CFGR_MCO_Msk (0x7UL << RCC_CFGR_MCO_Pos) /*!< 0x07000000 */ +#define RCC_CFGR_MCO RCC_CFGR_MCO_Msk /*!< MCO[2:0] bits (Microcontroller Clock Output) */ +#define RCC_CFGR_MCO_0 (0x1UL << RCC_CFGR_MCO_Pos) /*!< 0x01000000 */ +#define RCC_CFGR_MCO_1 (0x2UL << RCC_CFGR_MCO_Pos) /*!< 0x02000000 */ +#define RCC_CFGR_MCO_2 (0x4UL << RCC_CFGR_MCO_Pos) /*!< 0x04000000 */ + +#define RCC_CFGR_MCO_NOCLOCK 0x00000000U /*!< No clock */ +#define RCC_CFGR_MCO_SYSCLK 0x04000000U /*!< System clock selected as MCO source */ +#define RCC_CFGR_MCO_HSI 0x05000000U /*!< HSI clock selected as MCO source */ +#define RCC_CFGR_MCO_HSE 0x06000000U /*!< HSE clock selected as MCO source */ +#define RCC_CFGR_MCO_PLLCLK_DIV2 0x07000000U /*!< PLL clock divided by 2 selected as MCO source */ + + /* Reference defines */ + #define RCC_CFGR_MCOSEL RCC_CFGR_MCO + #define RCC_CFGR_MCOSEL_0 RCC_CFGR_MCO_0 + #define RCC_CFGR_MCOSEL_1 RCC_CFGR_MCO_1 + #define RCC_CFGR_MCOSEL_2 RCC_CFGR_MCO_2 + #define RCC_CFGR_MCOSEL_NOCLOCK RCC_CFGR_MCO_NOCLOCK + #define RCC_CFGR_MCOSEL_SYSCLK RCC_CFGR_MCO_SYSCLK + #define RCC_CFGR_MCOSEL_HSI RCC_CFGR_MCO_HSI + #define RCC_CFGR_MCOSEL_HSE RCC_CFGR_MCO_HSE + #define RCC_CFGR_MCOSEL_PLL_DIV2 RCC_CFGR_MCO_PLLCLK_DIV2 + +/*!<****************** Bit definition for RCC_CIR register ********************/ +#define RCC_CIR_LSIRDYF_Pos (0U) +#define RCC_CIR_LSIRDYF_Msk (0x1UL << RCC_CIR_LSIRDYF_Pos) /*!< 0x00000001 */ +#define RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF_Msk /*!< LSI Ready Interrupt flag */ +#define RCC_CIR_LSERDYF_Pos (1U) +#define RCC_CIR_LSERDYF_Msk (0x1UL << RCC_CIR_LSERDYF_Pos) /*!< 0x00000002 */ +#define RCC_CIR_LSERDYF RCC_CIR_LSERDYF_Msk /*!< LSE Ready Interrupt flag */ +#define RCC_CIR_HSIRDYF_Pos (2U) +#define RCC_CIR_HSIRDYF_Msk (0x1UL << RCC_CIR_HSIRDYF_Pos) /*!< 0x00000004 */ +#define RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF_Msk /*!< HSI Ready Interrupt flag */ +#define RCC_CIR_HSERDYF_Pos (3U) +#define RCC_CIR_HSERDYF_Msk (0x1UL << RCC_CIR_HSERDYF_Pos) /*!< 0x00000008 */ +#define RCC_CIR_HSERDYF RCC_CIR_HSERDYF_Msk /*!< HSE Ready Interrupt flag */ +#define RCC_CIR_PLLRDYF_Pos (4U) +#define RCC_CIR_PLLRDYF_Msk (0x1UL << RCC_CIR_PLLRDYF_Pos) /*!< 0x00000010 */ +#define RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF_Msk /*!< PLL Ready Interrupt flag */ +#define RCC_CIR_CSSF_Pos (7U) +#define RCC_CIR_CSSF_Msk (0x1UL << RCC_CIR_CSSF_Pos) /*!< 0x00000080 */ +#define RCC_CIR_CSSF RCC_CIR_CSSF_Msk /*!< Clock Security System Interrupt flag */ +#define RCC_CIR_LSIRDYIE_Pos (8U) +#define RCC_CIR_LSIRDYIE_Msk (0x1UL << RCC_CIR_LSIRDYIE_Pos) /*!< 0x00000100 */ +#define RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE_Msk /*!< LSI Ready Interrupt Enable */ +#define RCC_CIR_LSERDYIE_Pos (9U) +#define RCC_CIR_LSERDYIE_Msk (0x1UL << RCC_CIR_LSERDYIE_Pos) /*!< 0x00000200 */ +#define RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE_Msk /*!< LSE Ready Interrupt Enable */ +#define RCC_CIR_HSIRDYIE_Pos (10U) +#define RCC_CIR_HSIRDYIE_Msk (0x1UL << RCC_CIR_HSIRDYIE_Pos) /*!< 0x00000400 */ +#define RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE_Msk /*!< HSI Ready Interrupt Enable */ +#define RCC_CIR_HSERDYIE_Pos (11U) +#define RCC_CIR_HSERDYIE_Msk (0x1UL << RCC_CIR_HSERDYIE_Pos) /*!< 0x00000800 */ +#define RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE_Msk /*!< HSE Ready Interrupt Enable */ +#define RCC_CIR_PLLRDYIE_Pos (12U) +#define RCC_CIR_PLLRDYIE_Msk (0x1UL << RCC_CIR_PLLRDYIE_Pos) /*!< 0x00001000 */ +#define RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE_Msk /*!< PLL Ready Interrupt Enable */ +#define RCC_CIR_LSIRDYC_Pos (16U) +#define RCC_CIR_LSIRDYC_Msk (0x1UL << RCC_CIR_LSIRDYC_Pos) /*!< 0x00010000 */ +#define RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC_Msk /*!< LSI Ready Interrupt Clear */ +#define RCC_CIR_LSERDYC_Pos (17U) +#define RCC_CIR_LSERDYC_Msk (0x1UL << RCC_CIR_LSERDYC_Pos) /*!< 0x00020000 */ +#define RCC_CIR_LSERDYC RCC_CIR_LSERDYC_Msk /*!< LSE Ready Interrupt Clear */ +#define RCC_CIR_HSIRDYC_Pos (18U) +#define RCC_CIR_HSIRDYC_Msk (0x1UL << RCC_CIR_HSIRDYC_Pos) /*!< 0x00040000 */ +#define RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC_Msk /*!< HSI Ready Interrupt Clear */ +#define RCC_CIR_HSERDYC_Pos (19U) +#define RCC_CIR_HSERDYC_Msk (0x1UL << RCC_CIR_HSERDYC_Pos) /*!< 0x00080000 */ +#define RCC_CIR_HSERDYC RCC_CIR_HSERDYC_Msk /*!< HSE Ready Interrupt Clear */ +#define RCC_CIR_PLLRDYC_Pos (20U) +#define RCC_CIR_PLLRDYC_Msk (0x1UL << RCC_CIR_PLLRDYC_Pos) /*!< 0x00100000 */ +#define RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC_Msk /*!< PLL Ready Interrupt Clear */ +#define RCC_CIR_CSSC_Pos (23U) +#define RCC_CIR_CSSC_Msk (0x1UL << RCC_CIR_CSSC_Pos) /*!< 0x00800000 */ +#define RCC_CIR_CSSC RCC_CIR_CSSC_Msk /*!< Clock Security System Interrupt Clear */ + + +/***************** Bit definition for RCC_APB2RSTR register *****************/ +#define RCC_APB2RSTR_AFIORST_Pos (0U) +#define RCC_APB2RSTR_AFIORST_Msk (0x1UL << RCC_APB2RSTR_AFIORST_Pos) /*!< 0x00000001 */ +#define RCC_APB2RSTR_AFIORST RCC_APB2RSTR_AFIORST_Msk /*!< Alternate Function I/O reset */ +#define RCC_APB2RSTR_IOPARST_Pos (2U) +#define RCC_APB2RSTR_IOPARST_Msk (0x1UL << RCC_APB2RSTR_IOPARST_Pos) /*!< 0x00000004 */ +#define RCC_APB2RSTR_IOPARST RCC_APB2RSTR_IOPARST_Msk /*!< I/O port A reset */ +#define RCC_APB2RSTR_IOPBRST_Pos (3U) +#define RCC_APB2RSTR_IOPBRST_Msk (0x1UL << RCC_APB2RSTR_IOPBRST_Pos) /*!< 0x00000008 */ +#define RCC_APB2RSTR_IOPBRST RCC_APB2RSTR_IOPBRST_Msk /*!< I/O port B reset */ +#define RCC_APB2RSTR_IOPCRST_Pos (4U) +#define RCC_APB2RSTR_IOPCRST_Msk (0x1UL << RCC_APB2RSTR_IOPCRST_Pos) /*!< 0x00000010 */ +#define RCC_APB2RSTR_IOPCRST RCC_APB2RSTR_IOPCRST_Msk /*!< I/O port C reset */ +#define RCC_APB2RSTR_IOPDRST_Pos (5U) +#define RCC_APB2RSTR_IOPDRST_Msk (0x1UL << RCC_APB2RSTR_IOPDRST_Pos) /*!< 0x00000020 */ +#define RCC_APB2RSTR_IOPDRST RCC_APB2RSTR_IOPDRST_Msk /*!< I/O port D reset */ +#define RCC_APB2RSTR_ADC1RST_Pos (9U) +#define RCC_APB2RSTR_ADC1RST_Msk (0x1UL << RCC_APB2RSTR_ADC1RST_Pos) /*!< 0x00000200 */ +#define RCC_APB2RSTR_ADC1RST RCC_APB2RSTR_ADC1RST_Msk /*!< ADC 1 interface reset */ + +#define RCC_APB2RSTR_ADC2RST_Pos (10U) +#define RCC_APB2RSTR_ADC2RST_Msk (0x1UL << RCC_APB2RSTR_ADC2RST_Pos) /*!< 0x00000400 */ +#define RCC_APB2RSTR_ADC2RST RCC_APB2RSTR_ADC2RST_Msk /*!< ADC 2 interface reset */ + +#define RCC_APB2RSTR_TIM1RST_Pos (11U) +#define RCC_APB2RSTR_TIM1RST_Msk (0x1UL << RCC_APB2RSTR_TIM1RST_Pos) /*!< 0x00000800 */ +#define RCC_APB2RSTR_TIM1RST RCC_APB2RSTR_TIM1RST_Msk /*!< TIM1 Timer reset */ +#define RCC_APB2RSTR_SPI1RST_Pos (12U) +#define RCC_APB2RSTR_SPI1RST_Msk (0x1UL << RCC_APB2RSTR_SPI1RST_Pos) /*!< 0x00001000 */ +#define RCC_APB2RSTR_SPI1RST RCC_APB2RSTR_SPI1RST_Msk /*!< SPI 1 reset */ +#define RCC_APB2RSTR_USART1RST_Pos (14U) +#define RCC_APB2RSTR_USART1RST_Msk (0x1UL << RCC_APB2RSTR_USART1RST_Pos) /*!< 0x00004000 */ +#define RCC_APB2RSTR_USART1RST RCC_APB2RSTR_USART1RST_Msk /*!< USART1 reset */ + + +#define RCC_APB2RSTR_IOPERST_Pos (6U) +#define RCC_APB2RSTR_IOPERST_Msk (0x1UL << RCC_APB2RSTR_IOPERST_Pos) /*!< 0x00000040 */ +#define RCC_APB2RSTR_IOPERST RCC_APB2RSTR_IOPERST_Msk /*!< I/O port E reset */ + + + + +/***************** Bit definition for RCC_APB1RSTR register *****************/ +#define RCC_APB1RSTR_TIM2RST_Pos (0U) +#define RCC_APB1RSTR_TIM2RST_Msk (0x1UL << RCC_APB1RSTR_TIM2RST_Pos) /*!< 0x00000001 */ +#define RCC_APB1RSTR_TIM2RST RCC_APB1RSTR_TIM2RST_Msk /*!< Timer 2 reset */ +#define RCC_APB1RSTR_TIM3RST_Pos (1U) +#define RCC_APB1RSTR_TIM3RST_Msk (0x1UL << RCC_APB1RSTR_TIM3RST_Pos) /*!< 0x00000002 */ +#define RCC_APB1RSTR_TIM3RST RCC_APB1RSTR_TIM3RST_Msk /*!< Timer 3 reset */ +#define RCC_APB1RSTR_WWDGRST_Pos (11U) +#define RCC_APB1RSTR_WWDGRST_Msk (0x1UL << RCC_APB1RSTR_WWDGRST_Pos) /*!< 0x00000800 */ +#define RCC_APB1RSTR_WWDGRST RCC_APB1RSTR_WWDGRST_Msk /*!< Window Watchdog reset */ +#define RCC_APB1RSTR_USART2RST_Pos (17U) +#define RCC_APB1RSTR_USART2RST_Msk (0x1UL << RCC_APB1RSTR_USART2RST_Pos) /*!< 0x00020000 */ +#define RCC_APB1RSTR_USART2RST RCC_APB1RSTR_USART2RST_Msk /*!< USART 2 reset */ +#define RCC_APB1RSTR_I2C1RST_Pos (21U) +#define RCC_APB1RSTR_I2C1RST_Msk (0x1UL << RCC_APB1RSTR_I2C1RST_Pos) /*!< 0x00200000 */ +#define RCC_APB1RSTR_I2C1RST RCC_APB1RSTR_I2C1RST_Msk /*!< I2C 1 reset */ + +#define RCC_APB1RSTR_CAN1RST_Pos (25U) +#define RCC_APB1RSTR_CAN1RST_Msk (0x1UL << RCC_APB1RSTR_CAN1RST_Pos) /*!< 0x02000000 */ +#define RCC_APB1RSTR_CAN1RST RCC_APB1RSTR_CAN1RST_Msk /*!< CAN1 reset */ + +#define RCC_APB1RSTR_BKPRST_Pos (27U) +#define RCC_APB1RSTR_BKPRST_Msk (0x1UL << RCC_APB1RSTR_BKPRST_Pos) /*!< 0x08000000 */ +#define RCC_APB1RSTR_BKPRST RCC_APB1RSTR_BKPRST_Msk /*!< Backup interface reset */ +#define RCC_APB1RSTR_PWRRST_Pos (28U) +#define RCC_APB1RSTR_PWRRST_Msk (0x1UL << RCC_APB1RSTR_PWRRST_Pos) /*!< 0x10000000 */ +#define RCC_APB1RSTR_PWRRST RCC_APB1RSTR_PWRRST_Msk /*!< Power interface reset */ + +#define RCC_APB1RSTR_TIM4RST_Pos (2U) +#define RCC_APB1RSTR_TIM4RST_Msk (0x1UL << RCC_APB1RSTR_TIM4RST_Pos) /*!< 0x00000004 */ +#define RCC_APB1RSTR_TIM4RST RCC_APB1RSTR_TIM4RST_Msk /*!< Timer 4 reset */ +#define RCC_APB1RSTR_SPI2RST_Pos (14U) +#define RCC_APB1RSTR_SPI2RST_Msk (0x1UL << RCC_APB1RSTR_SPI2RST_Pos) /*!< 0x00004000 */ +#define RCC_APB1RSTR_SPI2RST RCC_APB1RSTR_SPI2RST_Msk /*!< SPI 2 reset */ +#define RCC_APB1RSTR_USART3RST_Pos (18U) +#define RCC_APB1RSTR_USART3RST_Msk (0x1UL << RCC_APB1RSTR_USART3RST_Pos) /*!< 0x00040000 */ +#define RCC_APB1RSTR_USART3RST RCC_APB1RSTR_USART3RST_Msk /*!< USART 3 reset */ +#define RCC_APB1RSTR_I2C2RST_Pos (22U) +#define RCC_APB1RSTR_I2C2RST_Msk (0x1UL << RCC_APB1RSTR_I2C2RST_Pos) /*!< 0x00400000 */ +#define RCC_APB1RSTR_I2C2RST RCC_APB1RSTR_I2C2RST_Msk /*!< I2C 2 reset */ + +#define RCC_APB1RSTR_USBRST_Pos (23U) +#define RCC_APB1RSTR_USBRST_Msk (0x1UL << RCC_APB1RSTR_USBRST_Pos) /*!< 0x00800000 */ +#define RCC_APB1RSTR_USBRST RCC_APB1RSTR_USBRST_Msk /*!< USB Device reset */ + + + + + + +/****************** Bit definition for RCC_AHBENR register ******************/ +#define RCC_AHBENR_DMA1EN_Pos (0U) +#define RCC_AHBENR_DMA1EN_Msk (0x1UL << RCC_AHBENR_DMA1EN_Pos) /*!< 0x00000001 */ +#define RCC_AHBENR_DMA1EN RCC_AHBENR_DMA1EN_Msk /*!< DMA1 clock enable */ +#define RCC_AHBENR_SRAMEN_Pos (2U) +#define RCC_AHBENR_SRAMEN_Msk (0x1UL << RCC_AHBENR_SRAMEN_Pos) /*!< 0x00000004 */ +#define RCC_AHBENR_SRAMEN RCC_AHBENR_SRAMEN_Msk /*!< SRAM interface clock enable */ +#define RCC_AHBENR_FLITFEN_Pos (4U) +#define RCC_AHBENR_FLITFEN_Msk (0x1UL << RCC_AHBENR_FLITFEN_Pos) /*!< 0x00000010 */ +#define RCC_AHBENR_FLITFEN RCC_AHBENR_FLITFEN_Msk /*!< FLITF clock enable */ +#define RCC_AHBENR_CRCEN_Pos (6U) +#define RCC_AHBENR_CRCEN_Msk (0x1UL << RCC_AHBENR_CRCEN_Pos) /*!< 0x00000040 */ +#define RCC_AHBENR_CRCEN RCC_AHBENR_CRCEN_Msk /*!< CRC clock enable */ + + + + +/****************** Bit definition for RCC_APB2ENR register *****************/ +#define RCC_APB2ENR_AFIOEN_Pos (0U) +#define RCC_APB2ENR_AFIOEN_Msk (0x1UL << RCC_APB2ENR_AFIOEN_Pos) /*!< 0x00000001 */ +#define RCC_APB2ENR_AFIOEN RCC_APB2ENR_AFIOEN_Msk /*!< Alternate Function I/O clock enable */ +#define RCC_APB2ENR_IOPAEN_Pos (2U) +#define RCC_APB2ENR_IOPAEN_Msk (0x1UL << RCC_APB2ENR_IOPAEN_Pos) /*!< 0x00000004 */ +#define RCC_APB2ENR_IOPAEN RCC_APB2ENR_IOPAEN_Msk /*!< I/O port A clock enable */ +#define RCC_APB2ENR_IOPBEN_Pos (3U) +#define RCC_APB2ENR_IOPBEN_Msk (0x1UL << RCC_APB2ENR_IOPBEN_Pos) /*!< 0x00000008 */ +#define RCC_APB2ENR_IOPBEN RCC_APB2ENR_IOPBEN_Msk /*!< I/O port B clock enable */ +#define RCC_APB2ENR_IOPCEN_Pos (4U) +#define RCC_APB2ENR_IOPCEN_Msk (0x1UL << RCC_APB2ENR_IOPCEN_Pos) /*!< 0x00000010 */ +#define RCC_APB2ENR_IOPCEN RCC_APB2ENR_IOPCEN_Msk /*!< I/O port C clock enable */ +#define RCC_APB2ENR_IOPDEN_Pos (5U) +#define RCC_APB2ENR_IOPDEN_Msk (0x1UL << RCC_APB2ENR_IOPDEN_Pos) /*!< 0x00000020 */ +#define RCC_APB2ENR_IOPDEN RCC_APB2ENR_IOPDEN_Msk /*!< I/O port D clock enable */ +#define RCC_APB2ENR_ADC1EN_Pos (9U) +#define RCC_APB2ENR_ADC1EN_Msk (0x1UL << RCC_APB2ENR_ADC1EN_Pos) /*!< 0x00000200 */ +#define RCC_APB2ENR_ADC1EN RCC_APB2ENR_ADC1EN_Msk /*!< ADC 1 interface clock enable */ + +#define RCC_APB2ENR_ADC2EN_Pos (10U) +#define RCC_APB2ENR_ADC2EN_Msk (0x1UL << RCC_APB2ENR_ADC2EN_Pos) /*!< 0x00000400 */ +#define RCC_APB2ENR_ADC2EN RCC_APB2ENR_ADC2EN_Msk /*!< ADC 2 interface clock enable */ + +#define RCC_APB2ENR_TIM1EN_Pos (11U) +#define RCC_APB2ENR_TIM1EN_Msk (0x1UL << RCC_APB2ENR_TIM1EN_Pos) /*!< 0x00000800 */ +#define RCC_APB2ENR_TIM1EN RCC_APB2ENR_TIM1EN_Msk /*!< TIM1 Timer clock enable */ +#define RCC_APB2ENR_SPI1EN_Pos (12U) +#define RCC_APB2ENR_SPI1EN_Msk (0x1UL << RCC_APB2ENR_SPI1EN_Pos) /*!< 0x00001000 */ +#define RCC_APB2ENR_SPI1EN RCC_APB2ENR_SPI1EN_Msk /*!< SPI 1 clock enable */ +#define RCC_APB2ENR_USART1EN_Pos (14U) +#define RCC_APB2ENR_USART1EN_Msk (0x1UL << RCC_APB2ENR_USART1EN_Pos) /*!< 0x00004000 */ +#define RCC_APB2ENR_USART1EN RCC_APB2ENR_USART1EN_Msk /*!< USART1 clock enable */ + + +#define RCC_APB2ENR_IOPEEN_Pos (6U) +#define RCC_APB2ENR_IOPEEN_Msk (0x1UL << RCC_APB2ENR_IOPEEN_Pos) /*!< 0x00000040 */ +#define RCC_APB2ENR_IOPEEN RCC_APB2ENR_IOPEEN_Msk /*!< I/O port E clock enable */ + + + + +/***************** Bit definition for RCC_APB1ENR register ******************/ +#define RCC_APB1ENR_TIM2EN_Pos (0U) +#define RCC_APB1ENR_TIM2EN_Msk (0x1UL << RCC_APB1ENR_TIM2EN_Pos) /*!< 0x00000001 */ +#define RCC_APB1ENR_TIM2EN RCC_APB1ENR_TIM2EN_Msk /*!< Timer 2 clock enabled*/ +#define RCC_APB1ENR_TIM3EN_Pos (1U) +#define RCC_APB1ENR_TIM3EN_Msk (0x1UL << RCC_APB1ENR_TIM3EN_Pos) /*!< 0x00000002 */ +#define RCC_APB1ENR_TIM3EN RCC_APB1ENR_TIM3EN_Msk /*!< Timer 3 clock enable */ +#define RCC_APB1ENR_WWDGEN_Pos (11U) +#define RCC_APB1ENR_WWDGEN_Msk (0x1UL << RCC_APB1ENR_WWDGEN_Pos) /*!< 0x00000800 */ +#define RCC_APB1ENR_WWDGEN RCC_APB1ENR_WWDGEN_Msk /*!< Window Watchdog clock enable */ +#define RCC_APB1ENR_USART2EN_Pos (17U) +#define RCC_APB1ENR_USART2EN_Msk (0x1UL << RCC_APB1ENR_USART2EN_Pos) /*!< 0x00020000 */ +#define RCC_APB1ENR_USART2EN RCC_APB1ENR_USART2EN_Msk /*!< USART 2 clock enable */ +#define RCC_APB1ENR_I2C1EN_Pos (21U) +#define RCC_APB1ENR_I2C1EN_Msk (0x1UL << RCC_APB1ENR_I2C1EN_Pos) /*!< 0x00200000 */ +#define RCC_APB1ENR_I2C1EN RCC_APB1ENR_I2C1EN_Msk /*!< I2C 1 clock enable */ + +#define RCC_APB1ENR_CAN1EN_Pos (25U) +#define RCC_APB1ENR_CAN1EN_Msk (0x1UL << RCC_APB1ENR_CAN1EN_Pos) /*!< 0x02000000 */ +#define RCC_APB1ENR_CAN1EN RCC_APB1ENR_CAN1EN_Msk /*!< CAN1 clock enable */ + +#define RCC_APB1ENR_BKPEN_Pos (27U) +#define RCC_APB1ENR_BKPEN_Msk (0x1UL << RCC_APB1ENR_BKPEN_Pos) /*!< 0x08000000 */ +#define RCC_APB1ENR_BKPEN RCC_APB1ENR_BKPEN_Msk /*!< Backup interface clock enable */ +#define RCC_APB1ENR_PWREN_Pos (28U) +#define RCC_APB1ENR_PWREN_Msk (0x1UL << RCC_APB1ENR_PWREN_Pos) /*!< 0x10000000 */ +#define RCC_APB1ENR_PWREN RCC_APB1ENR_PWREN_Msk /*!< Power interface clock enable */ + +#define RCC_APB1ENR_TIM4EN_Pos (2U) +#define RCC_APB1ENR_TIM4EN_Msk (0x1UL << RCC_APB1ENR_TIM4EN_Pos) /*!< 0x00000004 */ +#define RCC_APB1ENR_TIM4EN RCC_APB1ENR_TIM4EN_Msk /*!< Timer 4 clock enable */ +#define RCC_APB1ENR_SPI2EN_Pos (14U) +#define RCC_APB1ENR_SPI2EN_Msk (0x1UL << RCC_APB1ENR_SPI2EN_Pos) /*!< 0x00004000 */ +#define RCC_APB1ENR_SPI2EN RCC_APB1ENR_SPI2EN_Msk /*!< SPI 2 clock enable */ +#define RCC_APB1ENR_USART3EN_Pos (18U) +#define RCC_APB1ENR_USART3EN_Msk (0x1UL << RCC_APB1ENR_USART3EN_Pos) /*!< 0x00040000 */ +#define RCC_APB1ENR_USART3EN RCC_APB1ENR_USART3EN_Msk /*!< USART 3 clock enable */ +#define RCC_APB1ENR_I2C2EN_Pos (22U) +#define RCC_APB1ENR_I2C2EN_Msk (0x1UL << RCC_APB1ENR_I2C2EN_Pos) /*!< 0x00400000 */ +#define RCC_APB1ENR_I2C2EN RCC_APB1ENR_I2C2EN_Msk /*!< I2C 2 clock enable */ + +#define RCC_APB1ENR_USBEN_Pos (23U) +#define RCC_APB1ENR_USBEN_Msk (0x1UL << RCC_APB1ENR_USBEN_Pos) /*!< 0x00800000 */ +#define RCC_APB1ENR_USBEN RCC_APB1ENR_USBEN_Msk /*!< USB Device clock enable */ + + + + + + +/******************* Bit definition for RCC_BDCR register *******************/ +#define RCC_BDCR_LSEON_Pos (0U) +#define RCC_BDCR_LSEON_Msk (0x1UL << RCC_BDCR_LSEON_Pos) /*!< 0x00000001 */ +#define RCC_BDCR_LSEON RCC_BDCR_LSEON_Msk /*!< External Low Speed oscillator enable */ +#define RCC_BDCR_LSERDY_Pos (1U) +#define RCC_BDCR_LSERDY_Msk (0x1UL << RCC_BDCR_LSERDY_Pos) /*!< 0x00000002 */ +#define RCC_BDCR_LSERDY RCC_BDCR_LSERDY_Msk /*!< External Low Speed oscillator Ready */ +#define RCC_BDCR_LSEBYP_Pos (2U) +#define RCC_BDCR_LSEBYP_Msk (0x1UL << RCC_BDCR_LSEBYP_Pos) /*!< 0x00000004 */ +#define RCC_BDCR_LSEBYP RCC_BDCR_LSEBYP_Msk /*!< External Low Speed oscillator Bypass */ + +#define RCC_BDCR_RTCSEL_Pos (8U) +#define RCC_BDCR_RTCSEL_Msk (0x3UL << RCC_BDCR_RTCSEL_Pos) /*!< 0x00000300 */ +#define RCC_BDCR_RTCSEL RCC_BDCR_RTCSEL_Msk /*!< RTCSEL[1:0] bits (RTC clock source selection) */ +#define RCC_BDCR_RTCSEL_0 (0x1UL << RCC_BDCR_RTCSEL_Pos) /*!< 0x00000100 */ +#define RCC_BDCR_RTCSEL_1 (0x2UL << RCC_BDCR_RTCSEL_Pos) /*!< 0x00000200 */ + +/*!< RTC configuration */ +#define RCC_BDCR_RTCSEL_NOCLOCK 0x00000000U /*!< No clock */ +#define RCC_BDCR_RTCSEL_LSE 0x00000100U /*!< LSE oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_LSI 0x00000200U /*!< LSI oscillator clock used as RTC clock */ +#define RCC_BDCR_RTCSEL_HSE 0x00000300U /*!< HSE oscillator clock divided by 128 used as RTC clock */ + +#define RCC_BDCR_RTCEN_Pos (15U) +#define RCC_BDCR_RTCEN_Msk (0x1UL << RCC_BDCR_RTCEN_Pos) /*!< 0x00008000 */ +#define RCC_BDCR_RTCEN RCC_BDCR_RTCEN_Msk /*!< RTC clock enable */ +#define RCC_BDCR_BDRST_Pos (16U) +#define RCC_BDCR_BDRST_Msk (0x1UL << RCC_BDCR_BDRST_Pos) /*!< 0x00010000 */ +#define RCC_BDCR_BDRST RCC_BDCR_BDRST_Msk /*!< Backup domain software reset */ + +/******************* Bit definition for RCC_CSR register ********************/ +#define RCC_CSR_LSION_Pos (0U) +#define RCC_CSR_LSION_Msk (0x1UL << RCC_CSR_LSION_Pos) /*!< 0x00000001 */ +#define RCC_CSR_LSION RCC_CSR_LSION_Msk /*!< Internal Low Speed oscillator enable */ +#define RCC_CSR_LSIRDY_Pos (1U) +#define RCC_CSR_LSIRDY_Msk (0x1UL << RCC_CSR_LSIRDY_Pos) /*!< 0x00000002 */ +#define RCC_CSR_LSIRDY RCC_CSR_LSIRDY_Msk /*!< Internal Low Speed oscillator Ready */ +#define RCC_CSR_RMVF_Pos (24U) +#define RCC_CSR_RMVF_Msk (0x1UL << RCC_CSR_RMVF_Pos) /*!< 0x01000000 */ +#define RCC_CSR_RMVF RCC_CSR_RMVF_Msk /*!< Remove reset flag */ +#define RCC_CSR_PINRSTF_Pos (26U) +#define RCC_CSR_PINRSTF_Msk (0x1UL << RCC_CSR_PINRSTF_Pos) /*!< 0x04000000 */ +#define RCC_CSR_PINRSTF RCC_CSR_PINRSTF_Msk /*!< PIN reset flag */ +#define RCC_CSR_PORRSTF_Pos (27U) +#define RCC_CSR_PORRSTF_Msk (0x1UL << RCC_CSR_PORRSTF_Pos) /*!< 0x08000000 */ +#define RCC_CSR_PORRSTF RCC_CSR_PORRSTF_Msk /*!< POR/PDR reset flag */ +#define RCC_CSR_SFTRSTF_Pos (28U) +#define RCC_CSR_SFTRSTF_Msk (0x1UL << RCC_CSR_SFTRSTF_Pos) /*!< 0x10000000 */ +#define RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF_Msk /*!< Software Reset flag */ +#define RCC_CSR_IWDGRSTF_Pos (29U) +#define RCC_CSR_IWDGRSTF_Msk (0x1UL << RCC_CSR_IWDGRSTF_Pos) /*!< 0x20000000 */ +#define RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF_Msk /*!< Independent Watchdog reset flag */ +#define RCC_CSR_WWDGRSTF_Pos (30U) +#define RCC_CSR_WWDGRSTF_Msk (0x1UL << RCC_CSR_WWDGRSTF_Pos) /*!< 0x40000000 */ +#define RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF_Msk /*!< Window watchdog reset flag */ +#define RCC_CSR_LPWRRSTF_Pos (31U) +#define RCC_CSR_LPWRRSTF_Msk (0x1UL << RCC_CSR_LPWRRSTF_Pos) /*!< 0x80000000 */ +#define RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF_Msk /*!< Low-Power reset flag */ + + + +/******************************************************************************/ +/* */ +/* General Purpose and Alternate Function I/O */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for GPIO_CRL register *******************/ +#define GPIO_CRL_MODE_Pos (0U) +#define GPIO_CRL_MODE_Msk (0x33333333UL << GPIO_CRL_MODE_Pos) /*!< 0x33333333 */ +#define GPIO_CRL_MODE GPIO_CRL_MODE_Msk /*!< Port x mode bits */ + +#define GPIO_CRL_MODE0_Pos (0U) +#define GPIO_CRL_MODE0_Msk (0x3UL << GPIO_CRL_MODE0_Pos) /*!< 0x00000003 */ +#define GPIO_CRL_MODE0 GPIO_CRL_MODE0_Msk /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */ +#define GPIO_CRL_MODE0_0 (0x1UL << GPIO_CRL_MODE0_Pos) /*!< 0x00000001 */ +#define GPIO_CRL_MODE0_1 (0x2UL << GPIO_CRL_MODE0_Pos) /*!< 0x00000002 */ + +#define GPIO_CRL_MODE1_Pos (4U) +#define GPIO_CRL_MODE1_Msk (0x3UL << GPIO_CRL_MODE1_Pos) /*!< 0x00000030 */ +#define GPIO_CRL_MODE1 GPIO_CRL_MODE1_Msk /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */ +#define GPIO_CRL_MODE1_0 (0x1UL << GPIO_CRL_MODE1_Pos) /*!< 0x00000010 */ +#define GPIO_CRL_MODE1_1 (0x2UL << GPIO_CRL_MODE1_Pos) /*!< 0x00000020 */ + +#define GPIO_CRL_MODE2_Pos (8U) +#define GPIO_CRL_MODE2_Msk (0x3UL << GPIO_CRL_MODE2_Pos) /*!< 0x00000300 */ +#define GPIO_CRL_MODE2 GPIO_CRL_MODE2_Msk /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */ +#define GPIO_CRL_MODE2_0 (0x1UL << GPIO_CRL_MODE2_Pos) /*!< 0x00000100 */ +#define GPIO_CRL_MODE2_1 (0x2UL << GPIO_CRL_MODE2_Pos) /*!< 0x00000200 */ + +#define GPIO_CRL_MODE3_Pos (12U) +#define GPIO_CRL_MODE3_Msk (0x3UL << GPIO_CRL_MODE3_Pos) /*!< 0x00003000 */ +#define GPIO_CRL_MODE3 GPIO_CRL_MODE3_Msk /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */ +#define GPIO_CRL_MODE3_0 (0x1UL << GPIO_CRL_MODE3_Pos) /*!< 0x00001000 */ +#define GPIO_CRL_MODE3_1 (0x2UL << GPIO_CRL_MODE3_Pos) /*!< 0x00002000 */ + +#define GPIO_CRL_MODE4_Pos (16U) +#define GPIO_CRL_MODE4_Msk (0x3UL << GPIO_CRL_MODE4_Pos) /*!< 0x00030000 */ +#define GPIO_CRL_MODE4 GPIO_CRL_MODE4_Msk /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */ +#define GPIO_CRL_MODE4_0 (0x1UL << GPIO_CRL_MODE4_Pos) /*!< 0x00010000 */ +#define GPIO_CRL_MODE4_1 (0x2UL << GPIO_CRL_MODE4_Pos) /*!< 0x00020000 */ + +#define GPIO_CRL_MODE5_Pos (20U) +#define GPIO_CRL_MODE5_Msk (0x3UL << GPIO_CRL_MODE5_Pos) /*!< 0x00300000 */ +#define GPIO_CRL_MODE5 GPIO_CRL_MODE5_Msk /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */ +#define GPIO_CRL_MODE5_0 (0x1UL << GPIO_CRL_MODE5_Pos) /*!< 0x00100000 */ +#define GPIO_CRL_MODE5_1 (0x2UL << GPIO_CRL_MODE5_Pos) /*!< 0x00200000 */ + +#define GPIO_CRL_MODE6_Pos (24U) +#define GPIO_CRL_MODE6_Msk (0x3UL << GPIO_CRL_MODE6_Pos) /*!< 0x03000000 */ +#define GPIO_CRL_MODE6 GPIO_CRL_MODE6_Msk /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */ +#define GPIO_CRL_MODE6_0 (0x1UL << GPIO_CRL_MODE6_Pos) /*!< 0x01000000 */ +#define GPIO_CRL_MODE6_1 (0x2UL << GPIO_CRL_MODE6_Pos) /*!< 0x02000000 */ + +#define GPIO_CRL_MODE7_Pos (28U) +#define GPIO_CRL_MODE7_Msk (0x3UL << GPIO_CRL_MODE7_Pos) /*!< 0x30000000 */ +#define GPIO_CRL_MODE7 GPIO_CRL_MODE7_Msk /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */ +#define GPIO_CRL_MODE7_0 (0x1UL << GPIO_CRL_MODE7_Pos) /*!< 0x10000000 */ +#define GPIO_CRL_MODE7_1 (0x2UL << GPIO_CRL_MODE7_Pos) /*!< 0x20000000 */ + +#define GPIO_CRL_CNF_Pos (2U) +#define GPIO_CRL_CNF_Msk (0x33333333UL << GPIO_CRL_CNF_Pos) /*!< 0xCCCCCCCC */ +#define GPIO_CRL_CNF GPIO_CRL_CNF_Msk /*!< Port x configuration bits */ + +#define GPIO_CRL_CNF0_Pos (2U) +#define GPIO_CRL_CNF0_Msk (0x3UL << GPIO_CRL_CNF0_Pos) /*!< 0x0000000C */ +#define GPIO_CRL_CNF0 GPIO_CRL_CNF0_Msk /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */ +#define GPIO_CRL_CNF0_0 (0x1UL << GPIO_CRL_CNF0_Pos) /*!< 0x00000004 */ +#define GPIO_CRL_CNF0_1 (0x2UL << GPIO_CRL_CNF0_Pos) /*!< 0x00000008 */ + +#define GPIO_CRL_CNF1_Pos (6U) +#define GPIO_CRL_CNF1_Msk (0x3UL << GPIO_CRL_CNF1_Pos) /*!< 0x000000C0 */ +#define GPIO_CRL_CNF1 GPIO_CRL_CNF1_Msk /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */ +#define GPIO_CRL_CNF1_0 (0x1UL << GPIO_CRL_CNF1_Pos) /*!< 0x00000040 */ +#define GPIO_CRL_CNF1_1 (0x2UL << GPIO_CRL_CNF1_Pos) /*!< 0x00000080 */ + +#define GPIO_CRL_CNF2_Pos (10U) +#define GPIO_CRL_CNF2_Msk (0x3UL << GPIO_CRL_CNF2_Pos) /*!< 0x00000C00 */ +#define GPIO_CRL_CNF2 GPIO_CRL_CNF2_Msk /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */ +#define GPIO_CRL_CNF2_0 (0x1UL << GPIO_CRL_CNF2_Pos) /*!< 0x00000400 */ +#define GPIO_CRL_CNF2_1 (0x2UL << GPIO_CRL_CNF2_Pos) /*!< 0x00000800 */ + +#define GPIO_CRL_CNF3_Pos (14U) +#define GPIO_CRL_CNF3_Msk (0x3UL << GPIO_CRL_CNF3_Pos) /*!< 0x0000C000 */ +#define GPIO_CRL_CNF3 GPIO_CRL_CNF3_Msk /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */ +#define GPIO_CRL_CNF3_0 (0x1UL << GPIO_CRL_CNF3_Pos) /*!< 0x00004000 */ +#define GPIO_CRL_CNF3_1 (0x2UL << GPIO_CRL_CNF3_Pos) /*!< 0x00008000 */ + +#define GPIO_CRL_CNF4_Pos (18U) +#define GPIO_CRL_CNF4_Msk (0x3UL << GPIO_CRL_CNF4_Pos) /*!< 0x000C0000 */ +#define GPIO_CRL_CNF4 GPIO_CRL_CNF4_Msk /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */ +#define GPIO_CRL_CNF4_0 (0x1UL << GPIO_CRL_CNF4_Pos) /*!< 0x00040000 */ +#define GPIO_CRL_CNF4_1 (0x2UL << GPIO_CRL_CNF4_Pos) /*!< 0x00080000 */ + +#define GPIO_CRL_CNF5_Pos (22U) +#define GPIO_CRL_CNF5_Msk (0x3UL << GPIO_CRL_CNF5_Pos) /*!< 0x00C00000 */ +#define GPIO_CRL_CNF5 GPIO_CRL_CNF5_Msk /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */ +#define GPIO_CRL_CNF5_0 (0x1UL << GPIO_CRL_CNF5_Pos) /*!< 0x00400000 */ +#define GPIO_CRL_CNF5_1 (0x2UL << GPIO_CRL_CNF5_Pos) /*!< 0x00800000 */ + +#define GPIO_CRL_CNF6_Pos (26U) +#define GPIO_CRL_CNF6_Msk (0x3UL << GPIO_CRL_CNF6_Pos) /*!< 0x0C000000 */ +#define GPIO_CRL_CNF6 GPIO_CRL_CNF6_Msk /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */ +#define GPIO_CRL_CNF6_0 (0x1UL << GPIO_CRL_CNF6_Pos) /*!< 0x04000000 */ +#define GPIO_CRL_CNF6_1 (0x2UL << GPIO_CRL_CNF6_Pos) /*!< 0x08000000 */ + +#define GPIO_CRL_CNF7_Pos (30U) +#define GPIO_CRL_CNF7_Msk (0x3UL << GPIO_CRL_CNF7_Pos) /*!< 0xC0000000 */ +#define GPIO_CRL_CNF7 GPIO_CRL_CNF7_Msk /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */ +#define GPIO_CRL_CNF7_0 (0x1UL << GPIO_CRL_CNF7_Pos) /*!< 0x40000000 */ +#define GPIO_CRL_CNF7_1 (0x2UL << GPIO_CRL_CNF7_Pos) /*!< 0x80000000 */ + +/******************* Bit definition for GPIO_CRH register *******************/ +#define GPIO_CRH_MODE_Pos (0U) +#define GPIO_CRH_MODE_Msk (0x33333333UL << GPIO_CRH_MODE_Pos) /*!< 0x33333333 */ +#define GPIO_CRH_MODE GPIO_CRH_MODE_Msk /*!< Port x mode bits */ + +#define GPIO_CRH_MODE8_Pos (0U) +#define GPIO_CRH_MODE8_Msk (0x3UL << GPIO_CRH_MODE8_Pos) /*!< 0x00000003 */ +#define GPIO_CRH_MODE8 GPIO_CRH_MODE8_Msk /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */ +#define GPIO_CRH_MODE8_0 (0x1UL << GPIO_CRH_MODE8_Pos) /*!< 0x00000001 */ +#define GPIO_CRH_MODE8_1 (0x2UL << GPIO_CRH_MODE8_Pos) /*!< 0x00000002 */ + +#define GPIO_CRH_MODE9_Pos (4U) +#define GPIO_CRH_MODE9_Msk (0x3UL << GPIO_CRH_MODE9_Pos) /*!< 0x00000030 */ +#define GPIO_CRH_MODE9 GPIO_CRH_MODE9_Msk /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */ +#define GPIO_CRH_MODE9_0 (0x1UL << GPIO_CRH_MODE9_Pos) /*!< 0x00000010 */ +#define GPIO_CRH_MODE9_1 (0x2UL << GPIO_CRH_MODE9_Pos) /*!< 0x00000020 */ + +#define GPIO_CRH_MODE10_Pos (8U) +#define GPIO_CRH_MODE10_Msk (0x3UL << GPIO_CRH_MODE10_Pos) /*!< 0x00000300 */ +#define GPIO_CRH_MODE10 GPIO_CRH_MODE10_Msk /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */ +#define GPIO_CRH_MODE10_0 (0x1UL << GPIO_CRH_MODE10_Pos) /*!< 0x00000100 */ +#define GPIO_CRH_MODE10_1 (0x2UL << GPIO_CRH_MODE10_Pos) /*!< 0x00000200 */ + +#define GPIO_CRH_MODE11_Pos (12U) +#define GPIO_CRH_MODE11_Msk (0x3UL << GPIO_CRH_MODE11_Pos) /*!< 0x00003000 */ +#define GPIO_CRH_MODE11 GPIO_CRH_MODE11_Msk /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */ +#define GPIO_CRH_MODE11_0 (0x1UL << GPIO_CRH_MODE11_Pos) /*!< 0x00001000 */ +#define GPIO_CRH_MODE11_1 (0x2UL << GPIO_CRH_MODE11_Pos) /*!< 0x00002000 */ + +#define GPIO_CRH_MODE12_Pos (16U) +#define GPIO_CRH_MODE12_Msk (0x3UL << GPIO_CRH_MODE12_Pos) /*!< 0x00030000 */ +#define GPIO_CRH_MODE12 GPIO_CRH_MODE12_Msk /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */ +#define GPIO_CRH_MODE12_0 (0x1UL << GPIO_CRH_MODE12_Pos) /*!< 0x00010000 */ +#define GPIO_CRH_MODE12_1 (0x2UL << GPIO_CRH_MODE12_Pos) /*!< 0x00020000 */ + +#define GPIO_CRH_MODE13_Pos (20U) +#define GPIO_CRH_MODE13_Msk (0x3UL << GPIO_CRH_MODE13_Pos) /*!< 0x00300000 */ +#define GPIO_CRH_MODE13 GPIO_CRH_MODE13_Msk /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */ +#define GPIO_CRH_MODE13_0 (0x1UL << GPIO_CRH_MODE13_Pos) /*!< 0x00100000 */ +#define GPIO_CRH_MODE13_1 (0x2UL << GPIO_CRH_MODE13_Pos) /*!< 0x00200000 */ + +#define GPIO_CRH_MODE14_Pos (24U) +#define GPIO_CRH_MODE14_Msk (0x3UL << GPIO_CRH_MODE14_Pos) /*!< 0x03000000 */ +#define GPIO_CRH_MODE14 GPIO_CRH_MODE14_Msk /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */ +#define GPIO_CRH_MODE14_0 (0x1UL << GPIO_CRH_MODE14_Pos) /*!< 0x01000000 */ +#define GPIO_CRH_MODE14_1 (0x2UL << GPIO_CRH_MODE14_Pos) /*!< 0x02000000 */ + +#define GPIO_CRH_MODE15_Pos (28U) +#define GPIO_CRH_MODE15_Msk (0x3UL << GPIO_CRH_MODE15_Pos) /*!< 0x30000000 */ +#define GPIO_CRH_MODE15 GPIO_CRH_MODE15_Msk /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */ +#define GPIO_CRH_MODE15_0 (0x1UL << GPIO_CRH_MODE15_Pos) /*!< 0x10000000 */ +#define GPIO_CRH_MODE15_1 (0x2UL << GPIO_CRH_MODE15_Pos) /*!< 0x20000000 */ + +#define GPIO_CRH_CNF_Pos (2U) +#define GPIO_CRH_CNF_Msk (0x33333333UL << GPIO_CRH_CNF_Pos) /*!< 0xCCCCCCCC */ +#define GPIO_CRH_CNF GPIO_CRH_CNF_Msk /*!< Port x configuration bits */ + +#define GPIO_CRH_CNF8_Pos (2U) +#define GPIO_CRH_CNF8_Msk (0x3UL << GPIO_CRH_CNF8_Pos) /*!< 0x0000000C */ +#define GPIO_CRH_CNF8 GPIO_CRH_CNF8_Msk /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */ +#define GPIO_CRH_CNF8_0 (0x1UL << GPIO_CRH_CNF8_Pos) /*!< 0x00000004 */ +#define GPIO_CRH_CNF8_1 (0x2UL << GPIO_CRH_CNF8_Pos) /*!< 0x00000008 */ + +#define GPIO_CRH_CNF9_Pos (6U) +#define GPIO_CRH_CNF9_Msk (0x3UL << GPIO_CRH_CNF9_Pos) /*!< 0x000000C0 */ +#define GPIO_CRH_CNF9 GPIO_CRH_CNF9_Msk /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */ +#define GPIO_CRH_CNF9_0 (0x1UL << GPIO_CRH_CNF9_Pos) /*!< 0x00000040 */ +#define GPIO_CRH_CNF9_1 (0x2UL << GPIO_CRH_CNF9_Pos) /*!< 0x00000080 */ + +#define GPIO_CRH_CNF10_Pos (10U) +#define GPIO_CRH_CNF10_Msk (0x3UL << GPIO_CRH_CNF10_Pos) /*!< 0x00000C00 */ +#define GPIO_CRH_CNF10 GPIO_CRH_CNF10_Msk /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */ +#define GPIO_CRH_CNF10_0 (0x1UL << GPIO_CRH_CNF10_Pos) /*!< 0x00000400 */ +#define GPIO_CRH_CNF10_1 (0x2UL << GPIO_CRH_CNF10_Pos) /*!< 0x00000800 */ + +#define GPIO_CRH_CNF11_Pos (14U) +#define GPIO_CRH_CNF11_Msk (0x3UL << GPIO_CRH_CNF11_Pos) /*!< 0x0000C000 */ +#define GPIO_CRH_CNF11 GPIO_CRH_CNF11_Msk /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */ +#define GPIO_CRH_CNF11_0 (0x1UL << GPIO_CRH_CNF11_Pos) /*!< 0x00004000 */ +#define GPIO_CRH_CNF11_1 (0x2UL << GPIO_CRH_CNF11_Pos) /*!< 0x00008000 */ + +#define GPIO_CRH_CNF12_Pos (18U) +#define GPIO_CRH_CNF12_Msk (0x3UL << GPIO_CRH_CNF12_Pos) /*!< 0x000C0000 */ +#define GPIO_CRH_CNF12 GPIO_CRH_CNF12_Msk /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */ +#define GPIO_CRH_CNF12_0 (0x1UL << GPIO_CRH_CNF12_Pos) /*!< 0x00040000 */ +#define GPIO_CRH_CNF12_1 (0x2UL << GPIO_CRH_CNF12_Pos) /*!< 0x00080000 */ + +#define GPIO_CRH_CNF13_Pos (22U) +#define GPIO_CRH_CNF13_Msk (0x3UL << GPIO_CRH_CNF13_Pos) /*!< 0x00C00000 */ +#define GPIO_CRH_CNF13 GPIO_CRH_CNF13_Msk /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */ +#define GPIO_CRH_CNF13_0 (0x1UL << GPIO_CRH_CNF13_Pos) /*!< 0x00400000 */ +#define GPIO_CRH_CNF13_1 (0x2UL << GPIO_CRH_CNF13_Pos) /*!< 0x00800000 */ + +#define GPIO_CRH_CNF14_Pos (26U) +#define GPIO_CRH_CNF14_Msk (0x3UL << GPIO_CRH_CNF14_Pos) /*!< 0x0C000000 */ +#define GPIO_CRH_CNF14 GPIO_CRH_CNF14_Msk /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */ +#define GPIO_CRH_CNF14_0 (0x1UL << GPIO_CRH_CNF14_Pos) /*!< 0x04000000 */ +#define GPIO_CRH_CNF14_1 (0x2UL << GPIO_CRH_CNF14_Pos) /*!< 0x08000000 */ + +#define GPIO_CRH_CNF15_Pos (30U) +#define GPIO_CRH_CNF15_Msk (0x3UL << GPIO_CRH_CNF15_Pos) /*!< 0xC0000000 */ +#define GPIO_CRH_CNF15 GPIO_CRH_CNF15_Msk /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */ +#define GPIO_CRH_CNF15_0 (0x1UL << GPIO_CRH_CNF15_Pos) /*!< 0x40000000 */ +#define GPIO_CRH_CNF15_1 (0x2UL << GPIO_CRH_CNF15_Pos) /*!< 0x80000000 */ + +/*!<****************** Bit definition for GPIO_IDR register *******************/ +#define GPIO_IDR_IDR0_Pos (0U) +#define GPIO_IDR_IDR0_Msk (0x1UL << GPIO_IDR_IDR0_Pos) /*!< 0x00000001 */ +#define GPIO_IDR_IDR0 GPIO_IDR_IDR0_Msk /*!< Port input data, bit 0 */ +#define GPIO_IDR_IDR1_Pos (1U) +#define GPIO_IDR_IDR1_Msk (0x1UL << GPIO_IDR_IDR1_Pos) /*!< 0x00000002 */ +#define GPIO_IDR_IDR1 GPIO_IDR_IDR1_Msk /*!< Port input data, bit 1 */ +#define GPIO_IDR_IDR2_Pos (2U) +#define GPIO_IDR_IDR2_Msk (0x1UL << GPIO_IDR_IDR2_Pos) /*!< 0x00000004 */ +#define GPIO_IDR_IDR2 GPIO_IDR_IDR2_Msk /*!< Port input data, bit 2 */ +#define GPIO_IDR_IDR3_Pos (3U) +#define GPIO_IDR_IDR3_Msk (0x1UL << GPIO_IDR_IDR3_Pos) /*!< 0x00000008 */ +#define GPIO_IDR_IDR3 GPIO_IDR_IDR3_Msk /*!< Port input data, bit 3 */ +#define GPIO_IDR_IDR4_Pos (4U) +#define GPIO_IDR_IDR4_Msk (0x1UL << GPIO_IDR_IDR4_Pos) /*!< 0x00000010 */ +#define GPIO_IDR_IDR4 GPIO_IDR_IDR4_Msk /*!< Port input data, bit 4 */ +#define GPIO_IDR_IDR5_Pos (5U) +#define GPIO_IDR_IDR5_Msk (0x1UL << GPIO_IDR_IDR5_Pos) /*!< 0x00000020 */ +#define GPIO_IDR_IDR5 GPIO_IDR_IDR5_Msk /*!< Port input data, bit 5 */ +#define GPIO_IDR_IDR6_Pos (6U) +#define GPIO_IDR_IDR6_Msk (0x1UL << GPIO_IDR_IDR6_Pos) /*!< 0x00000040 */ +#define GPIO_IDR_IDR6 GPIO_IDR_IDR6_Msk /*!< Port input data, bit 6 */ +#define GPIO_IDR_IDR7_Pos (7U) +#define GPIO_IDR_IDR7_Msk (0x1UL << GPIO_IDR_IDR7_Pos) /*!< 0x00000080 */ +#define GPIO_IDR_IDR7 GPIO_IDR_IDR7_Msk /*!< Port input data, bit 7 */ +#define GPIO_IDR_IDR8_Pos (8U) +#define GPIO_IDR_IDR8_Msk (0x1UL << GPIO_IDR_IDR8_Pos) /*!< 0x00000100 */ +#define GPIO_IDR_IDR8 GPIO_IDR_IDR8_Msk /*!< Port input data, bit 8 */ +#define GPIO_IDR_IDR9_Pos (9U) +#define GPIO_IDR_IDR9_Msk (0x1UL << GPIO_IDR_IDR9_Pos) /*!< 0x00000200 */ +#define GPIO_IDR_IDR9 GPIO_IDR_IDR9_Msk /*!< Port input data, bit 9 */ +#define GPIO_IDR_IDR10_Pos (10U) +#define GPIO_IDR_IDR10_Msk (0x1UL << GPIO_IDR_IDR10_Pos) /*!< 0x00000400 */ +#define GPIO_IDR_IDR10 GPIO_IDR_IDR10_Msk /*!< Port input data, bit 10 */ +#define GPIO_IDR_IDR11_Pos (11U) +#define GPIO_IDR_IDR11_Msk (0x1UL << GPIO_IDR_IDR11_Pos) /*!< 0x00000800 */ +#define GPIO_IDR_IDR11 GPIO_IDR_IDR11_Msk /*!< Port input data, bit 11 */ +#define GPIO_IDR_IDR12_Pos (12U) +#define GPIO_IDR_IDR12_Msk (0x1UL << GPIO_IDR_IDR12_Pos) /*!< 0x00001000 */ +#define GPIO_IDR_IDR12 GPIO_IDR_IDR12_Msk /*!< Port input data, bit 12 */ +#define GPIO_IDR_IDR13_Pos (13U) +#define GPIO_IDR_IDR13_Msk (0x1UL << GPIO_IDR_IDR13_Pos) /*!< 0x00002000 */ +#define GPIO_IDR_IDR13 GPIO_IDR_IDR13_Msk /*!< Port input data, bit 13 */ +#define GPIO_IDR_IDR14_Pos (14U) +#define GPIO_IDR_IDR14_Msk (0x1UL << GPIO_IDR_IDR14_Pos) /*!< 0x00004000 */ +#define GPIO_IDR_IDR14 GPIO_IDR_IDR14_Msk /*!< Port input data, bit 14 */ +#define GPIO_IDR_IDR15_Pos (15U) +#define GPIO_IDR_IDR15_Msk (0x1UL << GPIO_IDR_IDR15_Pos) /*!< 0x00008000 */ +#define GPIO_IDR_IDR15 GPIO_IDR_IDR15_Msk /*!< Port input data, bit 15 */ + +/******************* Bit definition for GPIO_ODR register *******************/ +#define GPIO_ODR_ODR0_Pos (0U) +#define GPIO_ODR_ODR0_Msk (0x1UL << GPIO_ODR_ODR0_Pos) /*!< 0x00000001 */ +#define GPIO_ODR_ODR0 GPIO_ODR_ODR0_Msk /*!< Port output data, bit 0 */ +#define GPIO_ODR_ODR1_Pos (1U) +#define GPIO_ODR_ODR1_Msk (0x1UL << GPIO_ODR_ODR1_Pos) /*!< 0x00000002 */ +#define GPIO_ODR_ODR1 GPIO_ODR_ODR1_Msk /*!< Port output data, bit 1 */ +#define GPIO_ODR_ODR2_Pos (2U) +#define GPIO_ODR_ODR2_Msk (0x1UL << GPIO_ODR_ODR2_Pos) /*!< 0x00000004 */ +#define GPIO_ODR_ODR2 GPIO_ODR_ODR2_Msk /*!< Port output data, bit 2 */ +#define GPIO_ODR_ODR3_Pos (3U) +#define GPIO_ODR_ODR3_Msk (0x1UL << GPIO_ODR_ODR3_Pos) /*!< 0x00000008 */ +#define GPIO_ODR_ODR3 GPIO_ODR_ODR3_Msk /*!< Port output data, bit 3 */ +#define GPIO_ODR_ODR4_Pos (4U) +#define GPIO_ODR_ODR4_Msk (0x1UL << GPIO_ODR_ODR4_Pos) /*!< 0x00000010 */ +#define GPIO_ODR_ODR4 GPIO_ODR_ODR4_Msk /*!< Port output data, bit 4 */ +#define GPIO_ODR_ODR5_Pos (5U) +#define GPIO_ODR_ODR5_Msk (0x1UL << GPIO_ODR_ODR5_Pos) /*!< 0x00000020 */ +#define GPIO_ODR_ODR5 GPIO_ODR_ODR5_Msk /*!< Port output data, bit 5 */ +#define GPIO_ODR_ODR6_Pos (6U) +#define GPIO_ODR_ODR6_Msk (0x1UL << GPIO_ODR_ODR6_Pos) /*!< 0x00000040 */ +#define GPIO_ODR_ODR6 GPIO_ODR_ODR6_Msk /*!< Port output data, bit 6 */ +#define GPIO_ODR_ODR7_Pos (7U) +#define GPIO_ODR_ODR7_Msk (0x1UL << GPIO_ODR_ODR7_Pos) /*!< 0x00000080 */ +#define GPIO_ODR_ODR7 GPIO_ODR_ODR7_Msk /*!< Port output data, bit 7 */ +#define GPIO_ODR_ODR8_Pos (8U) +#define GPIO_ODR_ODR8_Msk (0x1UL << GPIO_ODR_ODR8_Pos) /*!< 0x00000100 */ +#define GPIO_ODR_ODR8 GPIO_ODR_ODR8_Msk /*!< Port output data, bit 8 */ +#define GPIO_ODR_ODR9_Pos (9U) +#define GPIO_ODR_ODR9_Msk (0x1UL << GPIO_ODR_ODR9_Pos) /*!< 0x00000200 */ +#define GPIO_ODR_ODR9 GPIO_ODR_ODR9_Msk /*!< Port output data, bit 9 */ +#define GPIO_ODR_ODR10_Pos (10U) +#define GPIO_ODR_ODR10_Msk (0x1UL << GPIO_ODR_ODR10_Pos) /*!< 0x00000400 */ +#define GPIO_ODR_ODR10 GPIO_ODR_ODR10_Msk /*!< Port output data, bit 10 */ +#define GPIO_ODR_ODR11_Pos (11U) +#define GPIO_ODR_ODR11_Msk (0x1UL << GPIO_ODR_ODR11_Pos) /*!< 0x00000800 */ +#define GPIO_ODR_ODR11 GPIO_ODR_ODR11_Msk /*!< Port output data, bit 11 */ +#define GPIO_ODR_ODR12_Pos (12U) +#define GPIO_ODR_ODR12_Msk (0x1UL << GPIO_ODR_ODR12_Pos) /*!< 0x00001000 */ +#define GPIO_ODR_ODR12 GPIO_ODR_ODR12_Msk /*!< Port output data, bit 12 */ +#define GPIO_ODR_ODR13_Pos (13U) +#define GPIO_ODR_ODR13_Msk (0x1UL << GPIO_ODR_ODR13_Pos) /*!< 0x00002000 */ +#define GPIO_ODR_ODR13 GPIO_ODR_ODR13_Msk /*!< Port output data, bit 13 */ +#define GPIO_ODR_ODR14_Pos (14U) +#define GPIO_ODR_ODR14_Msk (0x1UL << GPIO_ODR_ODR14_Pos) /*!< 0x00004000 */ +#define GPIO_ODR_ODR14 GPIO_ODR_ODR14_Msk /*!< Port output data, bit 14 */ +#define GPIO_ODR_ODR15_Pos (15U) +#define GPIO_ODR_ODR15_Msk (0x1UL << GPIO_ODR_ODR15_Pos) /*!< 0x00008000 */ +#define GPIO_ODR_ODR15 GPIO_ODR_ODR15_Msk /*!< Port output data, bit 15 */ + +/****************** Bit definition for GPIO_BSRR register *******************/ +#define GPIO_BSRR_BS0_Pos (0U) +#define GPIO_BSRR_BS0_Msk (0x1UL << GPIO_BSRR_BS0_Pos) /*!< 0x00000001 */ +#define GPIO_BSRR_BS0 GPIO_BSRR_BS0_Msk /*!< Port x Set bit 0 */ +#define GPIO_BSRR_BS1_Pos (1U) +#define GPIO_BSRR_BS1_Msk (0x1UL << GPIO_BSRR_BS1_Pos) /*!< 0x00000002 */ +#define GPIO_BSRR_BS1 GPIO_BSRR_BS1_Msk /*!< Port x Set bit 1 */ +#define GPIO_BSRR_BS2_Pos (2U) +#define GPIO_BSRR_BS2_Msk (0x1UL << GPIO_BSRR_BS2_Pos) /*!< 0x00000004 */ +#define GPIO_BSRR_BS2 GPIO_BSRR_BS2_Msk /*!< Port x Set bit 2 */ +#define GPIO_BSRR_BS3_Pos (3U) +#define GPIO_BSRR_BS3_Msk (0x1UL << GPIO_BSRR_BS3_Pos) /*!< 0x00000008 */ +#define GPIO_BSRR_BS3 GPIO_BSRR_BS3_Msk /*!< Port x Set bit 3 */ +#define GPIO_BSRR_BS4_Pos (4U) +#define GPIO_BSRR_BS4_Msk (0x1UL << GPIO_BSRR_BS4_Pos) /*!< 0x00000010 */ +#define GPIO_BSRR_BS4 GPIO_BSRR_BS4_Msk /*!< Port x Set bit 4 */ +#define GPIO_BSRR_BS5_Pos (5U) +#define GPIO_BSRR_BS5_Msk (0x1UL << GPIO_BSRR_BS5_Pos) /*!< 0x00000020 */ +#define GPIO_BSRR_BS5 GPIO_BSRR_BS5_Msk /*!< Port x Set bit 5 */ +#define GPIO_BSRR_BS6_Pos (6U) +#define GPIO_BSRR_BS6_Msk (0x1UL << GPIO_BSRR_BS6_Pos) /*!< 0x00000040 */ +#define GPIO_BSRR_BS6 GPIO_BSRR_BS6_Msk /*!< Port x Set bit 6 */ +#define GPIO_BSRR_BS7_Pos (7U) +#define GPIO_BSRR_BS7_Msk (0x1UL << GPIO_BSRR_BS7_Pos) /*!< 0x00000080 */ +#define GPIO_BSRR_BS7 GPIO_BSRR_BS7_Msk /*!< Port x Set bit 7 */ +#define GPIO_BSRR_BS8_Pos (8U) +#define GPIO_BSRR_BS8_Msk (0x1UL << GPIO_BSRR_BS8_Pos) /*!< 0x00000100 */ +#define GPIO_BSRR_BS8 GPIO_BSRR_BS8_Msk /*!< Port x Set bit 8 */ +#define GPIO_BSRR_BS9_Pos (9U) +#define GPIO_BSRR_BS9_Msk (0x1UL << GPIO_BSRR_BS9_Pos) /*!< 0x00000200 */ +#define GPIO_BSRR_BS9 GPIO_BSRR_BS9_Msk /*!< Port x Set bit 9 */ +#define GPIO_BSRR_BS10_Pos (10U) +#define GPIO_BSRR_BS10_Msk (0x1UL << GPIO_BSRR_BS10_Pos) /*!< 0x00000400 */ +#define GPIO_BSRR_BS10 GPIO_BSRR_BS10_Msk /*!< Port x Set bit 10 */ +#define GPIO_BSRR_BS11_Pos (11U) +#define GPIO_BSRR_BS11_Msk (0x1UL << GPIO_BSRR_BS11_Pos) /*!< 0x00000800 */ +#define GPIO_BSRR_BS11 GPIO_BSRR_BS11_Msk /*!< Port x Set bit 11 */ +#define GPIO_BSRR_BS12_Pos (12U) +#define GPIO_BSRR_BS12_Msk (0x1UL << GPIO_BSRR_BS12_Pos) /*!< 0x00001000 */ +#define GPIO_BSRR_BS12 GPIO_BSRR_BS12_Msk /*!< Port x Set bit 12 */ +#define GPIO_BSRR_BS13_Pos (13U) +#define GPIO_BSRR_BS13_Msk (0x1UL << GPIO_BSRR_BS13_Pos) /*!< 0x00002000 */ +#define GPIO_BSRR_BS13 GPIO_BSRR_BS13_Msk /*!< Port x Set bit 13 */ +#define GPIO_BSRR_BS14_Pos (14U) +#define GPIO_BSRR_BS14_Msk (0x1UL << GPIO_BSRR_BS14_Pos) /*!< 0x00004000 */ +#define GPIO_BSRR_BS14 GPIO_BSRR_BS14_Msk /*!< Port x Set bit 14 */ +#define GPIO_BSRR_BS15_Pos (15U) +#define GPIO_BSRR_BS15_Msk (0x1UL << GPIO_BSRR_BS15_Pos) /*!< 0x00008000 */ +#define GPIO_BSRR_BS15 GPIO_BSRR_BS15_Msk /*!< Port x Set bit 15 */ + +#define GPIO_BSRR_BR0_Pos (16U) +#define GPIO_BSRR_BR0_Msk (0x1UL << GPIO_BSRR_BR0_Pos) /*!< 0x00010000 */ +#define GPIO_BSRR_BR0 GPIO_BSRR_BR0_Msk /*!< Port x Reset bit 0 */ +#define GPIO_BSRR_BR1_Pos (17U) +#define GPIO_BSRR_BR1_Msk (0x1UL << GPIO_BSRR_BR1_Pos) /*!< 0x00020000 */ +#define GPIO_BSRR_BR1 GPIO_BSRR_BR1_Msk /*!< Port x Reset bit 1 */ +#define GPIO_BSRR_BR2_Pos (18U) +#define GPIO_BSRR_BR2_Msk (0x1UL << GPIO_BSRR_BR2_Pos) /*!< 0x00040000 */ +#define GPIO_BSRR_BR2 GPIO_BSRR_BR2_Msk /*!< Port x Reset bit 2 */ +#define GPIO_BSRR_BR3_Pos (19U) +#define GPIO_BSRR_BR3_Msk (0x1UL << GPIO_BSRR_BR3_Pos) /*!< 0x00080000 */ +#define GPIO_BSRR_BR3 GPIO_BSRR_BR3_Msk /*!< Port x Reset bit 3 */ +#define GPIO_BSRR_BR4_Pos (20U) +#define GPIO_BSRR_BR4_Msk (0x1UL << GPIO_BSRR_BR4_Pos) /*!< 0x00100000 */ +#define GPIO_BSRR_BR4 GPIO_BSRR_BR4_Msk /*!< Port x Reset bit 4 */ +#define GPIO_BSRR_BR5_Pos (21U) +#define GPIO_BSRR_BR5_Msk (0x1UL << GPIO_BSRR_BR5_Pos) /*!< 0x00200000 */ +#define GPIO_BSRR_BR5 GPIO_BSRR_BR5_Msk /*!< Port x Reset bit 5 */ +#define GPIO_BSRR_BR6_Pos (22U) +#define GPIO_BSRR_BR6_Msk (0x1UL << GPIO_BSRR_BR6_Pos) /*!< 0x00400000 */ +#define GPIO_BSRR_BR6 GPIO_BSRR_BR6_Msk /*!< Port x Reset bit 6 */ +#define GPIO_BSRR_BR7_Pos (23U) +#define GPIO_BSRR_BR7_Msk (0x1UL << GPIO_BSRR_BR7_Pos) /*!< 0x00800000 */ +#define GPIO_BSRR_BR7 GPIO_BSRR_BR7_Msk /*!< Port x Reset bit 7 */ +#define GPIO_BSRR_BR8_Pos (24U) +#define GPIO_BSRR_BR8_Msk (0x1UL << GPIO_BSRR_BR8_Pos) /*!< 0x01000000 */ +#define GPIO_BSRR_BR8 GPIO_BSRR_BR8_Msk /*!< Port x Reset bit 8 */ +#define GPIO_BSRR_BR9_Pos (25U) +#define GPIO_BSRR_BR9_Msk (0x1UL << GPIO_BSRR_BR9_Pos) /*!< 0x02000000 */ +#define GPIO_BSRR_BR9 GPIO_BSRR_BR9_Msk /*!< Port x Reset bit 9 */ +#define GPIO_BSRR_BR10_Pos (26U) +#define GPIO_BSRR_BR10_Msk (0x1UL << GPIO_BSRR_BR10_Pos) /*!< 0x04000000 */ +#define GPIO_BSRR_BR10 GPIO_BSRR_BR10_Msk /*!< Port x Reset bit 10 */ +#define GPIO_BSRR_BR11_Pos (27U) +#define GPIO_BSRR_BR11_Msk (0x1UL << GPIO_BSRR_BR11_Pos) /*!< 0x08000000 */ +#define GPIO_BSRR_BR11 GPIO_BSRR_BR11_Msk /*!< Port x Reset bit 11 */ +#define GPIO_BSRR_BR12_Pos (28U) +#define GPIO_BSRR_BR12_Msk (0x1UL << GPIO_BSRR_BR12_Pos) /*!< 0x10000000 */ +#define GPIO_BSRR_BR12 GPIO_BSRR_BR12_Msk /*!< Port x Reset bit 12 */ +#define GPIO_BSRR_BR13_Pos (29U) +#define GPIO_BSRR_BR13_Msk (0x1UL << GPIO_BSRR_BR13_Pos) /*!< 0x20000000 */ +#define GPIO_BSRR_BR13 GPIO_BSRR_BR13_Msk /*!< Port x Reset bit 13 */ +#define GPIO_BSRR_BR14_Pos (30U) +#define GPIO_BSRR_BR14_Msk (0x1UL << GPIO_BSRR_BR14_Pos) /*!< 0x40000000 */ +#define GPIO_BSRR_BR14 GPIO_BSRR_BR14_Msk /*!< Port x Reset bit 14 */ +#define GPIO_BSRR_BR15_Pos (31U) +#define GPIO_BSRR_BR15_Msk (0x1UL << GPIO_BSRR_BR15_Pos) /*!< 0x80000000 */ +#define GPIO_BSRR_BR15 GPIO_BSRR_BR15_Msk /*!< Port x Reset bit 15 */ + +/******************* Bit definition for GPIO_BRR register *******************/ +#define GPIO_BRR_BR0_Pos (0U) +#define GPIO_BRR_BR0_Msk (0x1UL << GPIO_BRR_BR0_Pos) /*!< 0x00000001 */ +#define GPIO_BRR_BR0 GPIO_BRR_BR0_Msk /*!< Port x Reset bit 0 */ +#define GPIO_BRR_BR1_Pos (1U) +#define GPIO_BRR_BR1_Msk (0x1UL << GPIO_BRR_BR1_Pos) /*!< 0x00000002 */ +#define GPIO_BRR_BR1 GPIO_BRR_BR1_Msk /*!< Port x Reset bit 1 */ +#define GPIO_BRR_BR2_Pos (2U) +#define GPIO_BRR_BR2_Msk (0x1UL << GPIO_BRR_BR2_Pos) /*!< 0x00000004 */ +#define GPIO_BRR_BR2 GPIO_BRR_BR2_Msk /*!< Port x Reset bit 2 */ +#define GPIO_BRR_BR3_Pos (3U) +#define GPIO_BRR_BR3_Msk (0x1UL << GPIO_BRR_BR3_Pos) /*!< 0x00000008 */ +#define GPIO_BRR_BR3 GPIO_BRR_BR3_Msk /*!< Port x Reset bit 3 */ +#define GPIO_BRR_BR4_Pos (4U) +#define GPIO_BRR_BR4_Msk (0x1UL << GPIO_BRR_BR4_Pos) /*!< 0x00000010 */ +#define GPIO_BRR_BR4 GPIO_BRR_BR4_Msk /*!< Port x Reset bit 4 */ +#define GPIO_BRR_BR5_Pos (5U) +#define GPIO_BRR_BR5_Msk (0x1UL << GPIO_BRR_BR5_Pos) /*!< 0x00000020 */ +#define GPIO_BRR_BR5 GPIO_BRR_BR5_Msk /*!< Port x Reset bit 5 */ +#define GPIO_BRR_BR6_Pos (6U) +#define GPIO_BRR_BR6_Msk (0x1UL << GPIO_BRR_BR6_Pos) /*!< 0x00000040 */ +#define GPIO_BRR_BR6 GPIO_BRR_BR6_Msk /*!< Port x Reset bit 6 */ +#define GPIO_BRR_BR7_Pos (7U) +#define GPIO_BRR_BR7_Msk (0x1UL << GPIO_BRR_BR7_Pos) /*!< 0x00000080 */ +#define GPIO_BRR_BR7 GPIO_BRR_BR7_Msk /*!< Port x Reset bit 7 */ +#define GPIO_BRR_BR8_Pos (8U) +#define GPIO_BRR_BR8_Msk (0x1UL << GPIO_BRR_BR8_Pos) /*!< 0x00000100 */ +#define GPIO_BRR_BR8 GPIO_BRR_BR8_Msk /*!< Port x Reset bit 8 */ +#define GPIO_BRR_BR9_Pos (9U) +#define GPIO_BRR_BR9_Msk (0x1UL << GPIO_BRR_BR9_Pos) /*!< 0x00000200 */ +#define GPIO_BRR_BR9 GPIO_BRR_BR9_Msk /*!< Port x Reset bit 9 */ +#define GPIO_BRR_BR10_Pos (10U) +#define GPIO_BRR_BR10_Msk (0x1UL << GPIO_BRR_BR10_Pos) /*!< 0x00000400 */ +#define GPIO_BRR_BR10 GPIO_BRR_BR10_Msk /*!< Port x Reset bit 10 */ +#define GPIO_BRR_BR11_Pos (11U) +#define GPIO_BRR_BR11_Msk (0x1UL << GPIO_BRR_BR11_Pos) /*!< 0x00000800 */ +#define GPIO_BRR_BR11 GPIO_BRR_BR11_Msk /*!< Port x Reset bit 11 */ +#define GPIO_BRR_BR12_Pos (12U) +#define GPIO_BRR_BR12_Msk (0x1UL << GPIO_BRR_BR12_Pos) /*!< 0x00001000 */ +#define GPIO_BRR_BR12 GPIO_BRR_BR12_Msk /*!< Port x Reset bit 12 */ +#define GPIO_BRR_BR13_Pos (13U) +#define GPIO_BRR_BR13_Msk (0x1UL << GPIO_BRR_BR13_Pos) /*!< 0x00002000 */ +#define GPIO_BRR_BR13 GPIO_BRR_BR13_Msk /*!< Port x Reset bit 13 */ +#define GPIO_BRR_BR14_Pos (14U) +#define GPIO_BRR_BR14_Msk (0x1UL << GPIO_BRR_BR14_Pos) /*!< 0x00004000 */ +#define GPIO_BRR_BR14 GPIO_BRR_BR14_Msk /*!< Port x Reset bit 14 */ +#define GPIO_BRR_BR15_Pos (15U) +#define GPIO_BRR_BR15_Msk (0x1UL << GPIO_BRR_BR15_Pos) /*!< 0x00008000 */ +#define GPIO_BRR_BR15 GPIO_BRR_BR15_Msk /*!< Port x Reset bit 15 */ + +/****************** Bit definition for GPIO_LCKR register *******************/ +#define GPIO_LCKR_LCK0_Pos (0U) +#define GPIO_LCKR_LCK0_Msk (0x1UL << GPIO_LCKR_LCK0_Pos) /*!< 0x00000001 */ +#define GPIO_LCKR_LCK0 GPIO_LCKR_LCK0_Msk /*!< Port x Lock bit 0 */ +#define GPIO_LCKR_LCK1_Pos (1U) +#define GPIO_LCKR_LCK1_Msk (0x1UL << GPIO_LCKR_LCK1_Pos) /*!< 0x00000002 */ +#define GPIO_LCKR_LCK1 GPIO_LCKR_LCK1_Msk /*!< Port x Lock bit 1 */ +#define GPIO_LCKR_LCK2_Pos (2U) +#define GPIO_LCKR_LCK2_Msk (0x1UL << GPIO_LCKR_LCK2_Pos) /*!< 0x00000004 */ +#define GPIO_LCKR_LCK2 GPIO_LCKR_LCK2_Msk /*!< Port x Lock bit 2 */ +#define GPIO_LCKR_LCK3_Pos (3U) +#define GPIO_LCKR_LCK3_Msk (0x1UL << GPIO_LCKR_LCK3_Pos) /*!< 0x00000008 */ +#define GPIO_LCKR_LCK3 GPIO_LCKR_LCK3_Msk /*!< Port x Lock bit 3 */ +#define GPIO_LCKR_LCK4_Pos (4U) +#define GPIO_LCKR_LCK4_Msk (0x1UL << GPIO_LCKR_LCK4_Pos) /*!< 0x00000010 */ +#define GPIO_LCKR_LCK4 GPIO_LCKR_LCK4_Msk /*!< Port x Lock bit 4 */ +#define GPIO_LCKR_LCK5_Pos (5U) +#define GPIO_LCKR_LCK5_Msk (0x1UL << GPIO_LCKR_LCK5_Pos) /*!< 0x00000020 */ +#define GPIO_LCKR_LCK5 GPIO_LCKR_LCK5_Msk /*!< Port x Lock bit 5 */ +#define GPIO_LCKR_LCK6_Pos (6U) +#define GPIO_LCKR_LCK6_Msk (0x1UL << GPIO_LCKR_LCK6_Pos) /*!< 0x00000040 */ +#define GPIO_LCKR_LCK6 GPIO_LCKR_LCK6_Msk /*!< Port x Lock bit 6 */ +#define GPIO_LCKR_LCK7_Pos (7U) +#define GPIO_LCKR_LCK7_Msk (0x1UL << GPIO_LCKR_LCK7_Pos) /*!< 0x00000080 */ +#define GPIO_LCKR_LCK7 GPIO_LCKR_LCK7_Msk /*!< Port x Lock bit 7 */ +#define GPIO_LCKR_LCK8_Pos (8U) +#define GPIO_LCKR_LCK8_Msk (0x1UL << GPIO_LCKR_LCK8_Pos) /*!< 0x00000100 */ +#define GPIO_LCKR_LCK8 GPIO_LCKR_LCK8_Msk /*!< Port x Lock bit 8 */ +#define GPIO_LCKR_LCK9_Pos (9U) +#define GPIO_LCKR_LCK9_Msk (0x1UL << GPIO_LCKR_LCK9_Pos) /*!< 0x00000200 */ +#define GPIO_LCKR_LCK9 GPIO_LCKR_LCK9_Msk /*!< Port x Lock bit 9 */ +#define GPIO_LCKR_LCK10_Pos (10U) +#define GPIO_LCKR_LCK10_Msk (0x1UL << GPIO_LCKR_LCK10_Pos) /*!< 0x00000400 */ +#define GPIO_LCKR_LCK10 GPIO_LCKR_LCK10_Msk /*!< Port x Lock bit 10 */ +#define GPIO_LCKR_LCK11_Pos (11U) +#define GPIO_LCKR_LCK11_Msk (0x1UL << GPIO_LCKR_LCK11_Pos) /*!< 0x00000800 */ +#define GPIO_LCKR_LCK11 GPIO_LCKR_LCK11_Msk /*!< Port x Lock bit 11 */ +#define GPIO_LCKR_LCK12_Pos (12U) +#define GPIO_LCKR_LCK12_Msk (0x1UL << GPIO_LCKR_LCK12_Pos) /*!< 0x00001000 */ +#define GPIO_LCKR_LCK12 GPIO_LCKR_LCK12_Msk /*!< Port x Lock bit 12 */ +#define GPIO_LCKR_LCK13_Pos (13U) +#define GPIO_LCKR_LCK13_Msk (0x1UL << GPIO_LCKR_LCK13_Pos) /*!< 0x00002000 */ +#define GPIO_LCKR_LCK13 GPIO_LCKR_LCK13_Msk /*!< Port x Lock bit 13 */ +#define GPIO_LCKR_LCK14_Pos (14U) +#define GPIO_LCKR_LCK14_Msk (0x1UL << GPIO_LCKR_LCK14_Pos) /*!< 0x00004000 */ +#define GPIO_LCKR_LCK14 GPIO_LCKR_LCK14_Msk /*!< Port x Lock bit 14 */ +#define GPIO_LCKR_LCK15_Pos (15U) +#define GPIO_LCKR_LCK15_Msk (0x1UL << GPIO_LCKR_LCK15_Pos) /*!< 0x00008000 */ +#define GPIO_LCKR_LCK15 GPIO_LCKR_LCK15_Msk /*!< Port x Lock bit 15 */ +#define GPIO_LCKR_LCKK_Pos (16U) +#define GPIO_LCKR_LCKK_Msk (0x1UL << GPIO_LCKR_LCKK_Pos) /*!< 0x00010000 */ +#define GPIO_LCKR_LCKK GPIO_LCKR_LCKK_Msk /*!< Lock key */ + +/*----------------------------------------------------------------------------*/ + +/****************** Bit definition for AFIO_EVCR register *******************/ +#define AFIO_EVCR_PIN_Pos (0U) +#define AFIO_EVCR_PIN_Msk (0xFUL << AFIO_EVCR_PIN_Pos) /*!< 0x0000000F */ +#define AFIO_EVCR_PIN AFIO_EVCR_PIN_Msk /*!< PIN[3:0] bits (Pin selection) */ +#define AFIO_EVCR_PIN_0 (0x1UL << AFIO_EVCR_PIN_Pos) /*!< 0x00000001 */ +#define AFIO_EVCR_PIN_1 (0x2UL << AFIO_EVCR_PIN_Pos) /*!< 0x00000002 */ +#define AFIO_EVCR_PIN_2 (0x4UL << AFIO_EVCR_PIN_Pos) /*!< 0x00000004 */ +#define AFIO_EVCR_PIN_3 (0x8UL << AFIO_EVCR_PIN_Pos) /*!< 0x00000008 */ + +/*!< PIN configuration */ +#define AFIO_EVCR_PIN_PX0 0x00000000U /*!< Pin 0 selected */ +#define AFIO_EVCR_PIN_PX1_Pos (0U) +#define AFIO_EVCR_PIN_PX1_Msk (0x1UL << AFIO_EVCR_PIN_PX1_Pos) /*!< 0x00000001 */ +#define AFIO_EVCR_PIN_PX1 AFIO_EVCR_PIN_PX1_Msk /*!< Pin 1 selected */ +#define AFIO_EVCR_PIN_PX2_Pos (1U) +#define AFIO_EVCR_PIN_PX2_Msk (0x1UL << AFIO_EVCR_PIN_PX2_Pos) /*!< 0x00000002 */ +#define AFIO_EVCR_PIN_PX2 AFIO_EVCR_PIN_PX2_Msk /*!< Pin 2 selected */ +#define AFIO_EVCR_PIN_PX3_Pos (0U) +#define AFIO_EVCR_PIN_PX3_Msk (0x3UL << AFIO_EVCR_PIN_PX3_Pos) /*!< 0x00000003 */ +#define AFIO_EVCR_PIN_PX3 AFIO_EVCR_PIN_PX3_Msk /*!< Pin 3 selected */ +#define AFIO_EVCR_PIN_PX4_Pos (2U) +#define AFIO_EVCR_PIN_PX4_Msk (0x1UL << AFIO_EVCR_PIN_PX4_Pos) /*!< 0x00000004 */ +#define AFIO_EVCR_PIN_PX4 AFIO_EVCR_PIN_PX4_Msk /*!< Pin 4 selected */ +#define AFIO_EVCR_PIN_PX5_Pos (0U) +#define AFIO_EVCR_PIN_PX5_Msk (0x5UL << AFIO_EVCR_PIN_PX5_Pos) /*!< 0x00000005 */ +#define AFIO_EVCR_PIN_PX5 AFIO_EVCR_PIN_PX5_Msk /*!< Pin 5 selected */ +#define AFIO_EVCR_PIN_PX6_Pos (1U) +#define AFIO_EVCR_PIN_PX6_Msk (0x3UL << AFIO_EVCR_PIN_PX6_Pos) /*!< 0x00000006 */ +#define AFIO_EVCR_PIN_PX6 AFIO_EVCR_PIN_PX6_Msk /*!< Pin 6 selected */ +#define AFIO_EVCR_PIN_PX7_Pos (0U) +#define AFIO_EVCR_PIN_PX7_Msk (0x7UL << AFIO_EVCR_PIN_PX7_Pos) /*!< 0x00000007 */ +#define AFIO_EVCR_PIN_PX7 AFIO_EVCR_PIN_PX7_Msk /*!< Pin 7 selected */ +#define AFIO_EVCR_PIN_PX8_Pos (3U) +#define AFIO_EVCR_PIN_PX8_Msk (0x1UL << AFIO_EVCR_PIN_PX8_Pos) /*!< 0x00000008 */ +#define AFIO_EVCR_PIN_PX8 AFIO_EVCR_PIN_PX8_Msk /*!< Pin 8 selected */ +#define AFIO_EVCR_PIN_PX9_Pos (0U) +#define AFIO_EVCR_PIN_PX9_Msk (0x9UL << AFIO_EVCR_PIN_PX9_Pos) /*!< 0x00000009 */ +#define AFIO_EVCR_PIN_PX9 AFIO_EVCR_PIN_PX9_Msk /*!< Pin 9 selected */ +#define AFIO_EVCR_PIN_PX10_Pos (1U) +#define AFIO_EVCR_PIN_PX10_Msk (0x5UL << AFIO_EVCR_PIN_PX10_Pos) /*!< 0x0000000A */ +#define AFIO_EVCR_PIN_PX10 AFIO_EVCR_PIN_PX10_Msk /*!< Pin 10 selected */ +#define AFIO_EVCR_PIN_PX11_Pos (0U) +#define AFIO_EVCR_PIN_PX11_Msk (0xBUL << AFIO_EVCR_PIN_PX11_Pos) /*!< 0x0000000B */ +#define AFIO_EVCR_PIN_PX11 AFIO_EVCR_PIN_PX11_Msk /*!< Pin 11 selected */ +#define AFIO_EVCR_PIN_PX12_Pos (2U) +#define AFIO_EVCR_PIN_PX12_Msk (0x3UL << AFIO_EVCR_PIN_PX12_Pos) /*!< 0x0000000C */ +#define AFIO_EVCR_PIN_PX12 AFIO_EVCR_PIN_PX12_Msk /*!< Pin 12 selected */ +#define AFIO_EVCR_PIN_PX13_Pos (0U) +#define AFIO_EVCR_PIN_PX13_Msk (0xDUL << AFIO_EVCR_PIN_PX13_Pos) /*!< 0x0000000D */ +#define AFIO_EVCR_PIN_PX13 AFIO_EVCR_PIN_PX13_Msk /*!< Pin 13 selected */ +#define AFIO_EVCR_PIN_PX14_Pos (1U) +#define AFIO_EVCR_PIN_PX14_Msk (0x7UL << AFIO_EVCR_PIN_PX14_Pos) /*!< 0x0000000E */ +#define AFIO_EVCR_PIN_PX14 AFIO_EVCR_PIN_PX14_Msk /*!< Pin 14 selected */ +#define AFIO_EVCR_PIN_PX15_Pos (0U) +#define AFIO_EVCR_PIN_PX15_Msk (0xFUL << AFIO_EVCR_PIN_PX15_Pos) /*!< 0x0000000F */ +#define AFIO_EVCR_PIN_PX15 AFIO_EVCR_PIN_PX15_Msk /*!< Pin 15 selected */ + +#define AFIO_EVCR_PORT_Pos (4U) +#define AFIO_EVCR_PORT_Msk (0x7UL << AFIO_EVCR_PORT_Pos) /*!< 0x00000070 */ +#define AFIO_EVCR_PORT AFIO_EVCR_PORT_Msk /*!< PORT[2:0] bits (Port selection) */ +#define AFIO_EVCR_PORT_0 (0x1UL << AFIO_EVCR_PORT_Pos) /*!< 0x00000010 */ +#define AFIO_EVCR_PORT_1 (0x2UL << AFIO_EVCR_PORT_Pos) /*!< 0x00000020 */ +#define AFIO_EVCR_PORT_2 (0x4UL << AFIO_EVCR_PORT_Pos) /*!< 0x00000040 */ + +/*!< PORT configuration */ +#define AFIO_EVCR_PORT_PA 0x00000000 /*!< Port A selected */ +#define AFIO_EVCR_PORT_PB_Pos (4U) +#define AFIO_EVCR_PORT_PB_Msk (0x1UL << AFIO_EVCR_PORT_PB_Pos) /*!< 0x00000010 */ +#define AFIO_EVCR_PORT_PB AFIO_EVCR_PORT_PB_Msk /*!< Port B selected */ +#define AFIO_EVCR_PORT_PC_Pos (5U) +#define AFIO_EVCR_PORT_PC_Msk (0x1UL << AFIO_EVCR_PORT_PC_Pos) /*!< 0x00000020 */ +#define AFIO_EVCR_PORT_PC AFIO_EVCR_PORT_PC_Msk /*!< Port C selected */ +#define AFIO_EVCR_PORT_PD_Pos (4U) +#define AFIO_EVCR_PORT_PD_Msk (0x3UL << AFIO_EVCR_PORT_PD_Pos) /*!< 0x00000030 */ +#define AFIO_EVCR_PORT_PD AFIO_EVCR_PORT_PD_Msk /*!< Port D selected */ +#define AFIO_EVCR_PORT_PE_Pos (6U) +#define AFIO_EVCR_PORT_PE_Msk (0x1UL << AFIO_EVCR_PORT_PE_Pos) /*!< 0x00000040 */ +#define AFIO_EVCR_PORT_PE AFIO_EVCR_PORT_PE_Msk /*!< Port E selected */ + +#define AFIO_EVCR_EVOE_Pos (7U) +#define AFIO_EVCR_EVOE_Msk (0x1UL << AFIO_EVCR_EVOE_Pos) /*!< 0x00000080 */ +#define AFIO_EVCR_EVOE AFIO_EVCR_EVOE_Msk /*!< Event Output Enable */ + +/****************** Bit definition for AFIO_MAPR register *******************/ +#define AFIO_MAPR_SPI1_REMAP_Pos (0U) +#define AFIO_MAPR_SPI1_REMAP_Msk (0x1UL << AFIO_MAPR_SPI1_REMAP_Pos) /*!< 0x00000001 */ +#define AFIO_MAPR_SPI1_REMAP AFIO_MAPR_SPI1_REMAP_Msk /*!< SPI1 remapping */ +#define AFIO_MAPR_I2C1_REMAP_Pos (1U) +#define AFIO_MAPR_I2C1_REMAP_Msk (0x1UL << AFIO_MAPR_I2C1_REMAP_Pos) /*!< 0x00000002 */ +#define AFIO_MAPR_I2C1_REMAP AFIO_MAPR_I2C1_REMAP_Msk /*!< I2C1 remapping */ +#define AFIO_MAPR_USART1_REMAP_Pos (2U) +#define AFIO_MAPR_USART1_REMAP_Msk (0x1UL << AFIO_MAPR_USART1_REMAP_Pos) /*!< 0x00000004 */ +#define AFIO_MAPR_USART1_REMAP AFIO_MAPR_USART1_REMAP_Msk /*!< USART1 remapping */ +#define AFIO_MAPR_USART2_REMAP_Pos (3U) +#define AFIO_MAPR_USART2_REMAP_Msk (0x1UL << AFIO_MAPR_USART2_REMAP_Pos) /*!< 0x00000008 */ +#define AFIO_MAPR_USART2_REMAP AFIO_MAPR_USART2_REMAP_Msk /*!< USART2 remapping */ + +#define AFIO_MAPR_USART3_REMAP_Pos (4U) +#define AFIO_MAPR_USART3_REMAP_Msk (0x3UL << AFIO_MAPR_USART3_REMAP_Pos) /*!< 0x00000030 */ +#define AFIO_MAPR_USART3_REMAP AFIO_MAPR_USART3_REMAP_Msk /*!< USART3_REMAP[1:0] bits (USART3 remapping) */ +#define AFIO_MAPR_USART3_REMAP_0 (0x1UL << AFIO_MAPR_USART3_REMAP_Pos) /*!< 0x00000010 */ +#define AFIO_MAPR_USART3_REMAP_1 (0x2UL << AFIO_MAPR_USART3_REMAP_Pos) /*!< 0x00000020 */ + +/* USART3_REMAP configuration */ +#define AFIO_MAPR_USART3_REMAP_NOREMAP 0x00000000U /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Pos (4U) +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Msk (0x1UL << AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Pos) /*!< 0x00000010 */ +#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Msk /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP_Pos (4U) +#define AFIO_MAPR_USART3_REMAP_FULLREMAP_Msk (0x3UL << AFIO_MAPR_USART3_REMAP_FULLREMAP_Pos) /*!< 0x00000030 */ +#define AFIO_MAPR_USART3_REMAP_FULLREMAP AFIO_MAPR_USART3_REMAP_FULLREMAP_Msk /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */ + +#define AFIO_MAPR_TIM1_REMAP_Pos (6U) +#define AFIO_MAPR_TIM1_REMAP_Msk (0x3UL << AFIO_MAPR_TIM1_REMAP_Pos) /*!< 0x000000C0 */ +#define AFIO_MAPR_TIM1_REMAP AFIO_MAPR_TIM1_REMAP_Msk /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */ +#define AFIO_MAPR_TIM1_REMAP_0 (0x1UL << AFIO_MAPR_TIM1_REMAP_Pos) /*!< 0x00000040 */ +#define AFIO_MAPR_TIM1_REMAP_1 (0x2UL << AFIO_MAPR_TIM1_REMAP_Pos) /*!< 0x00000080 */ + +/*!< TIM1_REMAP configuration */ +#define AFIO_MAPR_TIM1_REMAP_NOREMAP 0x00000000U /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Pos (6U) +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Msk (0x1UL << AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Pos) /*!< 0x00000040 */ +#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Msk /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP_Pos (6U) +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP_Msk (0x3UL << AFIO_MAPR_TIM1_REMAP_FULLREMAP_Pos) /*!< 0x000000C0 */ +#define AFIO_MAPR_TIM1_REMAP_FULLREMAP AFIO_MAPR_TIM1_REMAP_FULLREMAP_Msk /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */ + +#define AFIO_MAPR_TIM2_REMAP_Pos (8U) +#define AFIO_MAPR_TIM2_REMAP_Msk (0x3UL << AFIO_MAPR_TIM2_REMAP_Pos) /*!< 0x00000300 */ +#define AFIO_MAPR_TIM2_REMAP AFIO_MAPR_TIM2_REMAP_Msk /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */ +#define AFIO_MAPR_TIM2_REMAP_0 (0x1UL << AFIO_MAPR_TIM2_REMAP_Pos) /*!< 0x00000100 */ +#define AFIO_MAPR_TIM2_REMAP_1 (0x2UL << AFIO_MAPR_TIM2_REMAP_Pos) /*!< 0x00000200 */ + +/*!< TIM2_REMAP configuration */ +#define AFIO_MAPR_TIM2_REMAP_NOREMAP 0x00000000U /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Pos (8U) +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Msk (0x1UL << AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Pos) /*!< 0x00000100 */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Msk /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Pos (9U) +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Msk (0x1UL << AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Pos) /*!< 0x00000200 */ +#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Msk /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP_Pos (8U) +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP_Msk (0x3UL << AFIO_MAPR_TIM2_REMAP_FULLREMAP_Pos) /*!< 0x00000300 */ +#define AFIO_MAPR_TIM2_REMAP_FULLREMAP AFIO_MAPR_TIM2_REMAP_FULLREMAP_Msk /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */ + +#define AFIO_MAPR_TIM3_REMAP_Pos (10U) +#define AFIO_MAPR_TIM3_REMAP_Msk (0x3UL << AFIO_MAPR_TIM3_REMAP_Pos) /*!< 0x00000C00 */ +#define AFIO_MAPR_TIM3_REMAP AFIO_MAPR_TIM3_REMAP_Msk /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */ +#define AFIO_MAPR_TIM3_REMAP_0 (0x1UL << AFIO_MAPR_TIM3_REMAP_Pos) /*!< 0x00000400 */ +#define AFIO_MAPR_TIM3_REMAP_1 (0x2UL << AFIO_MAPR_TIM3_REMAP_Pos) /*!< 0x00000800 */ + +/*!< TIM3_REMAP configuration */ +#define AFIO_MAPR_TIM3_REMAP_NOREMAP 0x00000000U /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Pos (11U) +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Msk (0x1UL << AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Pos) /*!< 0x00000800 */ +#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Msk /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP_Pos (10U) +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP_Msk (0x3UL << AFIO_MAPR_TIM3_REMAP_FULLREMAP_Pos) /*!< 0x00000C00 */ +#define AFIO_MAPR_TIM3_REMAP_FULLREMAP AFIO_MAPR_TIM3_REMAP_FULLREMAP_Msk /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */ + +#define AFIO_MAPR_TIM4_REMAP_Pos (12U) +#define AFIO_MAPR_TIM4_REMAP_Msk (0x1UL << AFIO_MAPR_TIM4_REMAP_Pos) /*!< 0x00001000 */ +#define AFIO_MAPR_TIM4_REMAP AFIO_MAPR_TIM4_REMAP_Msk /*!< TIM4_REMAP bit (TIM4 remapping) */ + +#define AFIO_MAPR_CAN_REMAP_Pos (13U) +#define AFIO_MAPR_CAN_REMAP_Msk (0x3UL << AFIO_MAPR_CAN_REMAP_Pos) /*!< 0x00006000 */ +#define AFIO_MAPR_CAN_REMAP AFIO_MAPR_CAN_REMAP_Msk /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */ +#define AFIO_MAPR_CAN_REMAP_0 (0x1UL << AFIO_MAPR_CAN_REMAP_Pos) /*!< 0x00002000 */ +#define AFIO_MAPR_CAN_REMAP_1 (0x2UL << AFIO_MAPR_CAN_REMAP_Pos) /*!< 0x00004000 */ + +/*!< CAN_REMAP configuration */ +#define AFIO_MAPR_CAN_REMAP_REMAP1 0x00000000U /*!< CANRX mapped to PA11, CANTX mapped to PA12 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2_Pos (14U) +#define AFIO_MAPR_CAN_REMAP_REMAP2_Msk (0x1UL << AFIO_MAPR_CAN_REMAP_REMAP2_Pos) /*!< 0x00004000 */ +#define AFIO_MAPR_CAN_REMAP_REMAP2 AFIO_MAPR_CAN_REMAP_REMAP2_Msk /*!< CANRX mapped to PB8, CANTX mapped to PB9 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3_Pos (13U) +#define AFIO_MAPR_CAN_REMAP_REMAP3_Msk (0x3UL << AFIO_MAPR_CAN_REMAP_REMAP3_Pos) /*!< 0x00006000 */ +#define AFIO_MAPR_CAN_REMAP_REMAP3 AFIO_MAPR_CAN_REMAP_REMAP3_Msk /*!< CANRX mapped to PD0, CANTX mapped to PD1 */ + +#define AFIO_MAPR_PD01_REMAP_Pos (15U) +#define AFIO_MAPR_PD01_REMAP_Msk (0x1UL << AFIO_MAPR_PD01_REMAP_Pos) /*!< 0x00008000 */ +#define AFIO_MAPR_PD01_REMAP AFIO_MAPR_PD01_REMAP_Msk /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */ + +/*!< SWJ_CFG configuration */ +#define AFIO_MAPR_SWJ_CFG_Pos (24U) +#define AFIO_MAPR_SWJ_CFG_Msk (0x7UL << AFIO_MAPR_SWJ_CFG_Pos) /*!< 0x07000000 */ +#define AFIO_MAPR_SWJ_CFG AFIO_MAPR_SWJ_CFG_Msk /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */ +#define AFIO_MAPR_SWJ_CFG_0 (0x1UL << AFIO_MAPR_SWJ_CFG_Pos) /*!< 0x01000000 */ +#define AFIO_MAPR_SWJ_CFG_1 (0x2UL << AFIO_MAPR_SWJ_CFG_Pos) /*!< 0x02000000 */ +#define AFIO_MAPR_SWJ_CFG_2 (0x4UL << AFIO_MAPR_SWJ_CFG_Pos) /*!< 0x04000000 */ + +#define AFIO_MAPR_SWJ_CFG_RESET 0x00000000U /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST_Pos (24U) +#define AFIO_MAPR_SWJ_CFG_NOJNTRST_Msk (0x1UL << AFIO_MAPR_SWJ_CFG_NOJNTRST_Pos) /*!< 0x01000000 */ +#define AFIO_MAPR_SWJ_CFG_NOJNTRST AFIO_MAPR_SWJ_CFG_NOJNTRST_Msk /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Pos (25U) +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Msk (0x1UL << AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Pos) /*!< 0x02000000 */ +#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Msk /*!< JTAG-DP Disabled and SW-DP Enabled */ +#define AFIO_MAPR_SWJ_CFG_DISABLE_Pos (26U) +#define AFIO_MAPR_SWJ_CFG_DISABLE_Msk (0x1UL << AFIO_MAPR_SWJ_CFG_DISABLE_Pos) /*!< 0x04000000 */ +#define AFIO_MAPR_SWJ_CFG_DISABLE AFIO_MAPR_SWJ_CFG_DISABLE_Msk /*!< JTAG-DP Disabled and SW-DP Disabled */ + + +/***************** Bit definition for AFIO_EXTICR1 register *****************/ +#define AFIO_EXTICR1_EXTI0_Pos (0U) +#define AFIO_EXTICR1_EXTI0_Msk (0xFUL << AFIO_EXTICR1_EXTI0_Pos) /*!< 0x0000000F */ +#define AFIO_EXTICR1_EXTI0 AFIO_EXTICR1_EXTI0_Msk /*!< EXTI 0 configuration */ +#define AFIO_EXTICR1_EXTI1_Pos (4U) +#define AFIO_EXTICR1_EXTI1_Msk (0xFUL << AFIO_EXTICR1_EXTI1_Pos) /*!< 0x000000F0 */ +#define AFIO_EXTICR1_EXTI1 AFIO_EXTICR1_EXTI1_Msk /*!< EXTI 1 configuration */ +#define AFIO_EXTICR1_EXTI2_Pos (8U) +#define AFIO_EXTICR1_EXTI2_Msk (0xFUL << AFIO_EXTICR1_EXTI2_Pos) /*!< 0x00000F00 */ +#define AFIO_EXTICR1_EXTI2 AFIO_EXTICR1_EXTI2_Msk /*!< EXTI 2 configuration */ +#define AFIO_EXTICR1_EXTI3_Pos (12U) +#define AFIO_EXTICR1_EXTI3_Msk (0xFUL << AFIO_EXTICR1_EXTI3_Pos) /*!< 0x0000F000 */ +#define AFIO_EXTICR1_EXTI3 AFIO_EXTICR1_EXTI3_Msk /*!< EXTI 3 configuration */ + +/*!< EXTI0 configuration */ +#define AFIO_EXTICR1_EXTI0_PA 0x00000000U /*!< PA[0] pin */ +#define AFIO_EXTICR1_EXTI0_PB_Pos (0U) +#define AFIO_EXTICR1_EXTI0_PB_Msk (0x1UL << AFIO_EXTICR1_EXTI0_PB_Pos) /*!< 0x00000001 */ +#define AFIO_EXTICR1_EXTI0_PB AFIO_EXTICR1_EXTI0_PB_Msk /*!< PB[0] pin */ +#define AFIO_EXTICR1_EXTI0_PC_Pos (1U) +#define AFIO_EXTICR1_EXTI0_PC_Msk (0x1UL << AFIO_EXTICR1_EXTI0_PC_Pos) /*!< 0x00000002 */ +#define AFIO_EXTICR1_EXTI0_PC AFIO_EXTICR1_EXTI0_PC_Msk /*!< PC[0] pin */ +#define AFIO_EXTICR1_EXTI0_PD_Pos (0U) +#define AFIO_EXTICR1_EXTI0_PD_Msk (0x3UL << AFIO_EXTICR1_EXTI0_PD_Pos) /*!< 0x00000003 */ +#define AFIO_EXTICR1_EXTI0_PD AFIO_EXTICR1_EXTI0_PD_Msk /*!< PD[0] pin */ +#define AFIO_EXTICR1_EXTI0_PE_Pos (2U) +#define AFIO_EXTICR1_EXTI0_PE_Msk (0x1UL << AFIO_EXTICR1_EXTI0_PE_Pos) /*!< 0x00000004 */ +#define AFIO_EXTICR1_EXTI0_PE AFIO_EXTICR1_EXTI0_PE_Msk /*!< PE[0] pin */ +#define AFIO_EXTICR1_EXTI0_PF_Pos (0U) +#define AFIO_EXTICR1_EXTI0_PF_Msk (0x5UL << AFIO_EXTICR1_EXTI0_PF_Pos) /*!< 0x00000005 */ +#define AFIO_EXTICR1_EXTI0_PF AFIO_EXTICR1_EXTI0_PF_Msk /*!< PF[0] pin */ +#define AFIO_EXTICR1_EXTI0_PG_Pos (1U) +#define AFIO_EXTICR1_EXTI0_PG_Msk (0x3UL << AFIO_EXTICR1_EXTI0_PG_Pos) /*!< 0x00000006 */ +#define AFIO_EXTICR1_EXTI0_PG AFIO_EXTICR1_EXTI0_PG_Msk /*!< PG[0] pin */ + +/*!< EXTI1 configuration */ +#define AFIO_EXTICR1_EXTI1_PA 0x00000000U /*!< PA[1] pin */ +#define AFIO_EXTICR1_EXTI1_PB_Pos (4U) +#define AFIO_EXTICR1_EXTI1_PB_Msk (0x1UL << AFIO_EXTICR1_EXTI1_PB_Pos) /*!< 0x00000010 */ +#define AFIO_EXTICR1_EXTI1_PB AFIO_EXTICR1_EXTI1_PB_Msk /*!< PB[1] pin */ +#define AFIO_EXTICR1_EXTI1_PC_Pos (5U) +#define AFIO_EXTICR1_EXTI1_PC_Msk (0x1UL << AFIO_EXTICR1_EXTI1_PC_Pos) /*!< 0x00000020 */ +#define AFIO_EXTICR1_EXTI1_PC AFIO_EXTICR1_EXTI1_PC_Msk /*!< PC[1] pin */ +#define AFIO_EXTICR1_EXTI1_PD_Pos (4U) +#define AFIO_EXTICR1_EXTI1_PD_Msk (0x3UL << AFIO_EXTICR1_EXTI1_PD_Pos) /*!< 0x00000030 */ +#define AFIO_EXTICR1_EXTI1_PD AFIO_EXTICR1_EXTI1_PD_Msk /*!< PD[1] pin */ +#define AFIO_EXTICR1_EXTI1_PE_Pos (6U) +#define AFIO_EXTICR1_EXTI1_PE_Msk (0x1UL << AFIO_EXTICR1_EXTI1_PE_Pos) /*!< 0x00000040 */ +#define AFIO_EXTICR1_EXTI1_PE AFIO_EXTICR1_EXTI1_PE_Msk /*!< PE[1] pin */ +#define AFIO_EXTICR1_EXTI1_PF_Pos (4U) +#define AFIO_EXTICR1_EXTI1_PF_Msk (0x5UL << AFIO_EXTICR1_EXTI1_PF_Pos) /*!< 0x00000050 */ +#define AFIO_EXTICR1_EXTI1_PF AFIO_EXTICR1_EXTI1_PF_Msk /*!< PF[1] pin */ +#define AFIO_EXTICR1_EXTI1_PG_Pos (5U) +#define AFIO_EXTICR1_EXTI1_PG_Msk (0x3UL << AFIO_EXTICR1_EXTI1_PG_Pos) /*!< 0x00000060 */ +#define AFIO_EXTICR1_EXTI1_PG AFIO_EXTICR1_EXTI1_PG_Msk /*!< PG[1] pin */ + +/*!< EXTI2 configuration */ +#define AFIO_EXTICR1_EXTI2_PA 0x00000000U /*!< PA[2] pin */ +#define AFIO_EXTICR1_EXTI2_PB_Pos (8U) +#define AFIO_EXTICR1_EXTI2_PB_Msk (0x1UL << AFIO_EXTICR1_EXTI2_PB_Pos) /*!< 0x00000100 */ +#define AFIO_EXTICR1_EXTI2_PB AFIO_EXTICR1_EXTI2_PB_Msk /*!< PB[2] pin */ +#define AFIO_EXTICR1_EXTI2_PC_Pos (9U) +#define AFIO_EXTICR1_EXTI2_PC_Msk (0x1UL << AFIO_EXTICR1_EXTI2_PC_Pos) /*!< 0x00000200 */ +#define AFIO_EXTICR1_EXTI2_PC AFIO_EXTICR1_EXTI2_PC_Msk /*!< PC[2] pin */ +#define AFIO_EXTICR1_EXTI2_PD_Pos (8U) +#define AFIO_EXTICR1_EXTI2_PD_Msk (0x3UL << AFIO_EXTICR1_EXTI2_PD_Pos) /*!< 0x00000300 */ +#define AFIO_EXTICR1_EXTI2_PD AFIO_EXTICR1_EXTI2_PD_Msk /*!< PD[2] pin */ +#define AFIO_EXTICR1_EXTI2_PE_Pos (10U) +#define AFIO_EXTICR1_EXTI2_PE_Msk (0x1UL << AFIO_EXTICR1_EXTI2_PE_Pos) /*!< 0x00000400 */ +#define AFIO_EXTICR1_EXTI2_PE AFIO_EXTICR1_EXTI2_PE_Msk /*!< PE[2] pin */ +#define AFIO_EXTICR1_EXTI2_PF_Pos (8U) +#define AFIO_EXTICR1_EXTI2_PF_Msk (0x5UL << AFIO_EXTICR1_EXTI2_PF_Pos) /*!< 0x00000500 */ +#define AFIO_EXTICR1_EXTI2_PF AFIO_EXTICR1_EXTI2_PF_Msk /*!< PF[2] pin */ +#define AFIO_EXTICR1_EXTI2_PG_Pos (9U) +#define AFIO_EXTICR1_EXTI2_PG_Msk (0x3UL << AFIO_EXTICR1_EXTI2_PG_Pos) /*!< 0x00000600 */ +#define AFIO_EXTICR1_EXTI2_PG AFIO_EXTICR1_EXTI2_PG_Msk /*!< PG[2] pin */ + +/*!< EXTI3 configuration */ +#define AFIO_EXTICR1_EXTI3_PA 0x00000000U /*!< PA[3] pin */ +#define AFIO_EXTICR1_EXTI3_PB_Pos (12U) +#define AFIO_EXTICR1_EXTI3_PB_Msk (0x1UL << AFIO_EXTICR1_EXTI3_PB_Pos) /*!< 0x00001000 */ +#define AFIO_EXTICR1_EXTI3_PB AFIO_EXTICR1_EXTI3_PB_Msk /*!< PB[3] pin */ +#define AFIO_EXTICR1_EXTI3_PC_Pos (13U) +#define AFIO_EXTICR1_EXTI3_PC_Msk (0x1UL << AFIO_EXTICR1_EXTI3_PC_Pos) /*!< 0x00002000 */ +#define AFIO_EXTICR1_EXTI3_PC AFIO_EXTICR1_EXTI3_PC_Msk /*!< PC[3] pin */ +#define AFIO_EXTICR1_EXTI3_PD_Pos (12U) +#define AFIO_EXTICR1_EXTI3_PD_Msk (0x3UL << AFIO_EXTICR1_EXTI3_PD_Pos) /*!< 0x00003000 */ +#define AFIO_EXTICR1_EXTI3_PD AFIO_EXTICR1_EXTI3_PD_Msk /*!< PD[3] pin */ +#define AFIO_EXTICR1_EXTI3_PE_Pos (14U) +#define AFIO_EXTICR1_EXTI3_PE_Msk (0x1UL << AFIO_EXTICR1_EXTI3_PE_Pos) /*!< 0x00004000 */ +#define AFIO_EXTICR1_EXTI3_PE AFIO_EXTICR1_EXTI3_PE_Msk /*!< PE[3] pin */ +#define AFIO_EXTICR1_EXTI3_PF_Pos (12U) +#define AFIO_EXTICR1_EXTI3_PF_Msk (0x5UL << AFIO_EXTICR1_EXTI3_PF_Pos) /*!< 0x00005000 */ +#define AFIO_EXTICR1_EXTI3_PF AFIO_EXTICR1_EXTI3_PF_Msk /*!< PF[3] pin */ +#define AFIO_EXTICR1_EXTI3_PG_Pos (13U) +#define AFIO_EXTICR1_EXTI3_PG_Msk (0x3UL << AFIO_EXTICR1_EXTI3_PG_Pos) /*!< 0x00006000 */ +#define AFIO_EXTICR1_EXTI3_PG AFIO_EXTICR1_EXTI3_PG_Msk /*!< PG[3] pin */ + +/***************** Bit definition for AFIO_EXTICR2 register *****************/ +#define AFIO_EXTICR2_EXTI4_Pos (0U) +#define AFIO_EXTICR2_EXTI4_Msk (0xFUL << AFIO_EXTICR2_EXTI4_Pos) /*!< 0x0000000F */ +#define AFIO_EXTICR2_EXTI4 AFIO_EXTICR2_EXTI4_Msk /*!< EXTI 4 configuration */ +#define AFIO_EXTICR2_EXTI5_Pos (4U) +#define AFIO_EXTICR2_EXTI5_Msk (0xFUL << AFIO_EXTICR2_EXTI5_Pos) /*!< 0x000000F0 */ +#define AFIO_EXTICR2_EXTI5 AFIO_EXTICR2_EXTI5_Msk /*!< EXTI 5 configuration */ +#define AFIO_EXTICR2_EXTI6_Pos (8U) +#define AFIO_EXTICR2_EXTI6_Msk (0xFUL << AFIO_EXTICR2_EXTI6_Pos) /*!< 0x00000F00 */ +#define AFIO_EXTICR2_EXTI6 AFIO_EXTICR2_EXTI6_Msk /*!< EXTI 6 configuration */ +#define AFIO_EXTICR2_EXTI7_Pos (12U) +#define AFIO_EXTICR2_EXTI7_Msk (0xFUL << AFIO_EXTICR2_EXTI7_Pos) /*!< 0x0000F000 */ +#define AFIO_EXTICR2_EXTI7 AFIO_EXTICR2_EXTI7_Msk /*!< EXTI 7 configuration */ + +/*!< EXTI4 configuration */ +#define AFIO_EXTICR2_EXTI4_PA 0x00000000U /*!< PA[4] pin */ +#define AFIO_EXTICR2_EXTI4_PB_Pos (0U) +#define AFIO_EXTICR2_EXTI4_PB_Msk (0x1UL << AFIO_EXTICR2_EXTI4_PB_Pos) /*!< 0x00000001 */ +#define AFIO_EXTICR2_EXTI4_PB AFIO_EXTICR2_EXTI4_PB_Msk /*!< PB[4] pin */ +#define AFIO_EXTICR2_EXTI4_PC_Pos (1U) +#define AFIO_EXTICR2_EXTI4_PC_Msk (0x1UL << AFIO_EXTICR2_EXTI4_PC_Pos) /*!< 0x00000002 */ +#define AFIO_EXTICR2_EXTI4_PC AFIO_EXTICR2_EXTI4_PC_Msk /*!< PC[4] pin */ +#define AFIO_EXTICR2_EXTI4_PD_Pos (0U) +#define AFIO_EXTICR2_EXTI4_PD_Msk (0x3UL << AFIO_EXTICR2_EXTI4_PD_Pos) /*!< 0x00000003 */ +#define AFIO_EXTICR2_EXTI4_PD AFIO_EXTICR2_EXTI4_PD_Msk /*!< PD[4] pin */ +#define AFIO_EXTICR2_EXTI4_PE_Pos (2U) +#define AFIO_EXTICR2_EXTI4_PE_Msk (0x1UL << AFIO_EXTICR2_EXTI4_PE_Pos) /*!< 0x00000004 */ +#define AFIO_EXTICR2_EXTI4_PE AFIO_EXTICR2_EXTI4_PE_Msk /*!< PE[4] pin */ +#define AFIO_EXTICR2_EXTI4_PF_Pos (0U) +#define AFIO_EXTICR2_EXTI4_PF_Msk (0x5UL << AFIO_EXTICR2_EXTI4_PF_Pos) /*!< 0x00000005 */ +#define AFIO_EXTICR2_EXTI4_PF AFIO_EXTICR2_EXTI4_PF_Msk /*!< PF[4] pin */ +#define AFIO_EXTICR2_EXTI4_PG_Pos (1U) +#define AFIO_EXTICR2_EXTI4_PG_Msk (0x3UL << AFIO_EXTICR2_EXTI4_PG_Pos) /*!< 0x00000006 */ +#define AFIO_EXTICR2_EXTI4_PG AFIO_EXTICR2_EXTI4_PG_Msk /*!< PG[4] pin */ + +/* EXTI5 configuration */ +#define AFIO_EXTICR2_EXTI5_PA 0x00000000U /*!< PA[5] pin */ +#define AFIO_EXTICR2_EXTI5_PB_Pos (4U) +#define AFIO_EXTICR2_EXTI5_PB_Msk (0x1UL << AFIO_EXTICR2_EXTI5_PB_Pos) /*!< 0x00000010 */ +#define AFIO_EXTICR2_EXTI5_PB AFIO_EXTICR2_EXTI5_PB_Msk /*!< PB[5] pin */ +#define AFIO_EXTICR2_EXTI5_PC_Pos (5U) +#define AFIO_EXTICR2_EXTI5_PC_Msk (0x1UL << AFIO_EXTICR2_EXTI5_PC_Pos) /*!< 0x00000020 */ +#define AFIO_EXTICR2_EXTI5_PC AFIO_EXTICR2_EXTI5_PC_Msk /*!< PC[5] pin */ +#define AFIO_EXTICR2_EXTI5_PD_Pos (4U) +#define AFIO_EXTICR2_EXTI5_PD_Msk (0x3UL << AFIO_EXTICR2_EXTI5_PD_Pos) /*!< 0x00000030 */ +#define AFIO_EXTICR2_EXTI5_PD AFIO_EXTICR2_EXTI5_PD_Msk /*!< PD[5] pin */ +#define AFIO_EXTICR2_EXTI5_PE_Pos (6U) +#define AFIO_EXTICR2_EXTI5_PE_Msk (0x1UL << AFIO_EXTICR2_EXTI5_PE_Pos) /*!< 0x00000040 */ +#define AFIO_EXTICR2_EXTI5_PE AFIO_EXTICR2_EXTI5_PE_Msk /*!< PE[5] pin */ +#define AFIO_EXTICR2_EXTI5_PF_Pos (4U) +#define AFIO_EXTICR2_EXTI5_PF_Msk (0x5UL << AFIO_EXTICR2_EXTI5_PF_Pos) /*!< 0x00000050 */ +#define AFIO_EXTICR2_EXTI5_PF AFIO_EXTICR2_EXTI5_PF_Msk /*!< PF[5] pin */ +#define AFIO_EXTICR2_EXTI5_PG_Pos (5U) +#define AFIO_EXTICR2_EXTI5_PG_Msk (0x3UL << AFIO_EXTICR2_EXTI5_PG_Pos) /*!< 0x00000060 */ +#define AFIO_EXTICR2_EXTI5_PG AFIO_EXTICR2_EXTI5_PG_Msk /*!< PG[5] pin */ + +/*!< EXTI6 configuration */ +#define AFIO_EXTICR2_EXTI6_PA 0x00000000U /*!< PA[6] pin */ +#define AFIO_EXTICR2_EXTI6_PB_Pos (8U) +#define AFIO_EXTICR2_EXTI6_PB_Msk (0x1UL << AFIO_EXTICR2_EXTI6_PB_Pos) /*!< 0x00000100 */ +#define AFIO_EXTICR2_EXTI6_PB AFIO_EXTICR2_EXTI6_PB_Msk /*!< PB[6] pin */ +#define AFIO_EXTICR2_EXTI6_PC_Pos (9U) +#define AFIO_EXTICR2_EXTI6_PC_Msk (0x1UL << AFIO_EXTICR2_EXTI6_PC_Pos) /*!< 0x00000200 */ +#define AFIO_EXTICR2_EXTI6_PC AFIO_EXTICR2_EXTI6_PC_Msk /*!< PC[6] pin */ +#define AFIO_EXTICR2_EXTI6_PD_Pos (8U) +#define AFIO_EXTICR2_EXTI6_PD_Msk (0x3UL << AFIO_EXTICR2_EXTI6_PD_Pos) /*!< 0x00000300 */ +#define AFIO_EXTICR2_EXTI6_PD AFIO_EXTICR2_EXTI6_PD_Msk /*!< PD[6] pin */ +#define AFIO_EXTICR2_EXTI6_PE_Pos (10U) +#define AFIO_EXTICR2_EXTI6_PE_Msk (0x1UL << AFIO_EXTICR2_EXTI6_PE_Pos) /*!< 0x00000400 */ +#define AFIO_EXTICR2_EXTI6_PE AFIO_EXTICR2_EXTI6_PE_Msk /*!< PE[6] pin */ +#define AFIO_EXTICR2_EXTI6_PF_Pos (8U) +#define AFIO_EXTICR2_EXTI6_PF_Msk (0x5UL << AFIO_EXTICR2_EXTI6_PF_Pos) /*!< 0x00000500 */ +#define AFIO_EXTICR2_EXTI6_PF AFIO_EXTICR2_EXTI6_PF_Msk /*!< PF[6] pin */ +#define AFIO_EXTICR2_EXTI6_PG_Pos (9U) +#define AFIO_EXTICR2_EXTI6_PG_Msk (0x3UL << AFIO_EXTICR2_EXTI6_PG_Pos) /*!< 0x00000600 */ +#define AFIO_EXTICR2_EXTI6_PG AFIO_EXTICR2_EXTI6_PG_Msk /*!< PG[6] pin */ + +/*!< EXTI7 configuration */ +#define AFIO_EXTICR2_EXTI7_PA 0x00000000U /*!< PA[7] pin */ +#define AFIO_EXTICR2_EXTI7_PB_Pos (12U) +#define AFIO_EXTICR2_EXTI7_PB_Msk (0x1UL << AFIO_EXTICR2_EXTI7_PB_Pos) /*!< 0x00001000 */ +#define AFIO_EXTICR2_EXTI7_PB AFIO_EXTICR2_EXTI7_PB_Msk /*!< PB[7] pin */ +#define AFIO_EXTICR2_EXTI7_PC_Pos (13U) +#define AFIO_EXTICR2_EXTI7_PC_Msk (0x1UL << AFIO_EXTICR2_EXTI7_PC_Pos) /*!< 0x00002000 */ +#define AFIO_EXTICR2_EXTI7_PC AFIO_EXTICR2_EXTI7_PC_Msk /*!< PC[7] pin */ +#define AFIO_EXTICR2_EXTI7_PD_Pos (12U) +#define AFIO_EXTICR2_EXTI7_PD_Msk (0x3UL << AFIO_EXTICR2_EXTI7_PD_Pos) /*!< 0x00003000 */ +#define AFIO_EXTICR2_EXTI7_PD AFIO_EXTICR2_EXTI7_PD_Msk /*!< PD[7] pin */ +#define AFIO_EXTICR2_EXTI7_PE_Pos (14U) +#define AFIO_EXTICR2_EXTI7_PE_Msk (0x1UL << AFIO_EXTICR2_EXTI7_PE_Pos) /*!< 0x00004000 */ +#define AFIO_EXTICR2_EXTI7_PE AFIO_EXTICR2_EXTI7_PE_Msk /*!< PE[7] pin */ +#define AFIO_EXTICR2_EXTI7_PF_Pos (12U) +#define AFIO_EXTICR2_EXTI7_PF_Msk (0x5UL << AFIO_EXTICR2_EXTI7_PF_Pos) /*!< 0x00005000 */ +#define AFIO_EXTICR2_EXTI7_PF AFIO_EXTICR2_EXTI7_PF_Msk /*!< PF[7] pin */ +#define AFIO_EXTICR2_EXTI7_PG_Pos (13U) +#define AFIO_EXTICR2_EXTI7_PG_Msk (0x3UL << AFIO_EXTICR2_EXTI7_PG_Pos) /*!< 0x00006000 */ +#define AFIO_EXTICR2_EXTI7_PG AFIO_EXTICR2_EXTI7_PG_Msk /*!< PG[7] pin */ + +/***************** Bit definition for AFIO_EXTICR3 register *****************/ +#define AFIO_EXTICR3_EXTI8_Pos (0U) +#define AFIO_EXTICR3_EXTI8_Msk (0xFUL << AFIO_EXTICR3_EXTI8_Pos) /*!< 0x0000000F */ +#define AFIO_EXTICR3_EXTI8 AFIO_EXTICR3_EXTI8_Msk /*!< EXTI 8 configuration */ +#define AFIO_EXTICR3_EXTI9_Pos (4U) +#define AFIO_EXTICR3_EXTI9_Msk (0xFUL << AFIO_EXTICR3_EXTI9_Pos) /*!< 0x000000F0 */ +#define AFIO_EXTICR3_EXTI9 AFIO_EXTICR3_EXTI9_Msk /*!< EXTI 9 configuration */ +#define AFIO_EXTICR3_EXTI10_Pos (8U) +#define AFIO_EXTICR3_EXTI10_Msk (0xFUL << AFIO_EXTICR3_EXTI10_Pos) /*!< 0x00000F00 */ +#define AFIO_EXTICR3_EXTI10 AFIO_EXTICR3_EXTI10_Msk /*!< EXTI 10 configuration */ +#define AFIO_EXTICR3_EXTI11_Pos (12U) +#define AFIO_EXTICR3_EXTI11_Msk (0xFUL << AFIO_EXTICR3_EXTI11_Pos) /*!< 0x0000F000 */ +#define AFIO_EXTICR3_EXTI11 AFIO_EXTICR3_EXTI11_Msk /*!< EXTI 11 configuration */ + +/*!< EXTI8 configuration */ +#define AFIO_EXTICR3_EXTI8_PA 0x00000000U /*!< PA[8] pin */ +#define AFIO_EXTICR3_EXTI8_PB_Pos (0U) +#define AFIO_EXTICR3_EXTI8_PB_Msk (0x1UL << AFIO_EXTICR3_EXTI8_PB_Pos) /*!< 0x00000001 */ +#define AFIO_EXTICR3_EXTI8_PB AFIO_EXTICR3_EXTI8_PB_Msk /*!< PB[8] pin */ +#define AFIO_EXTICR3_EXTI8_PC_Pos (1U) +#define AFIO_EXTICR3_EXTI8_PC_Msk (0x1UL << AFIO_EXTICR3_EXTI8_PC_Pos) /*!< 0x00000002 */ +#define AFIO_EXTICR3_EXTI8_PC AFIO_EXTICR3_EXTI8_PC_Msk /*!< PC[8] pin */ +#define AFIO_EXTICR3_EXTI8_PD_Pos (0U) +#define AFIO_EXTICR3_EXTI8_PD_Msk (0x3UL << AFIO_EXTICR3_EXTI8_PD_Pos) /*!< 0x00000003 */ +#define AFIO_EXTICR3_EXTI8_PD AFIO_EXTICR3_EXTI8_PD_Msk /*!< PD[8] pin */ +#define AFIO_EXTICR3_EXTI8_PE_Pos (2U) +#define AFIO_EXTICR3_EXTI8_PE_Msk (0x1UL << AFIO_EXTICR3_EXTI8_PE_Pos) /*!< 0x00000004 */ +#define AFIO_EXTICR3_EXTI8_PE AFIO_EXTICR3_EXTI8_PE_Msk /*!< PE[8] pin */ +#define AFIO_EXTICR3_EXTI8_PF_Pos (0U) +#define AFIO_EXTICR3_EXTI8_PF_Msk (0x5UL << AFIO_EXTICR3_EXTI8_PF_Pos) /*!< 0x00000005 */ +#define AFIO_EXTICR3_EXTI8_PF AFIO_EXTICR3_EXTI8_PF_Msk /*!< PF[8] pin */ +#define AFIO_EXTICR3_EXTI8_PG_Pos (1U) +#define AFIO_EXTICR3_EXTI8_PG_Msk (0x3UL << AFIO_EXTICR3_EXTI8_PG_Pos) /*!< 0x00000006 */ +#define AFIO_EXTICR3_EXTI8_PG AFIO_EXTICR3_EXTI8_PG_Msk /*!< PG[8] pin */ + +/*!< EXTI9 configuration */ +#define AFIO_EXTICR3_EXTI9_PA 0x00000000U /*!< PA[9] pin */ +#define AFIO_EXTICR3_EXTI9_PB_Pos (4U) +#define AFIO_EXTICR3_EXTI9_PB_Msk (0x1UL << AFIO_EXTICR3_EXTI9_PB_Pos) /*!< 0x00000010 */ +#define AFIO_EXTICR3_EXTI9_PB AFIO_EXTICR3_EXTI9_PB_Msk /*!< PB[9] pin */ +#define AFIO_EXTICR3_EXTI9_PC_Pos (5U) +#define AFIO_EXTICR3_EXTI9_PC_Msk (0x1UL << AFIO_EXTICR3_EXTI9_PC_Pos) /*!< 0x00000020 */ +#define AFIO_EXTICR3_EXTI9_PC AFIO_EXTICR3_EXTI9_PC_Msk /*!< PC[9] pin */ +#define AFIO_EXTICR3_EXTI9_PD_Pos (4U) +#define AFIO_EXTICR3_EXTI9_PD_Msk (0x3UL << AFIO_EXTICR3_EXTI9_PD_Pos) /*!< 0x00000030 */ +#define AFIO_EXTICR3_EXTI9_PD AFIO_EXTICR3_EXTI9_PD_Msk /*!< PD[9] pin */ +#define AFIO_EXTICR3_EXTI9_PE_Pos (6U) +#define AFIO_EXTICR3_EXTI9_PE_Msk (0x1UL << AFIO_EXTICR3_EXTI9_PE_Pos) /*!< 0x00000040 */ +#define AFIO_EXTICR3_EXTI9_PE AFIO_EXTICR3_EXTI9_PE_Msk /*!< PE[9] pin */ +#define AFIO_EXTICR3_EXTI9_PF_Pos (4U) +#define AFIO_EXTICR3_EXTI9_PF_Msk (0x5UL << AFIO_EXTICR3_EXTI9_PF_Pos) /*!< 0x00000050 */ +#define AFIO_EXTICR3_EXTI9_PF AFIO_EXTICR3_EXTI9_PF_Msk /*!< PF[9] pin */ +#define AFIO_EXTICR3_EXTI9_PG_Pos (5U) +#define AFIO_EXTICR3_EXTI9_PG_Msk (0x3UL << AFIO_EXTICR3_EXTI9_PG_Pos) /*!< 0x00000060 */ +#define AFIO_EXTICR3_EXTI9_PG AFIO_EXTICR3_EXTI9_PG_Msk /*!< PG[9] pin */ + +/*!< EXTI10 configuration */ +#define AFIO_EXTICR3_EXTI10_PA 0x00000000U /*!< PA[10] pin */ +#define AFIO_EXTICR3_EXTI10_PB_Pos (8U) +#define AFIO_EXTICR3_EXTI10_PB_Msk (0x1UL << AFIO_EXTICR3_EXTI10_PB_Pos) /*!< 0x00000100 */ +#define AFIO_EXTICR3_EXTI10_PB AFIO_EXTICR3_EXTI10_PB_Msk /*!< PB[10] pin */ +#define AFIO_EXTICR3_EXTI10_PC_Pos (9U) +#define AFIO_EXTICR3_EXTI10_PC_Msk (0x1UL << AFIO_EXTICR3_EXTI10_PC_Pos) /*!< 0x00000200 */ +#define AFIO_EXTICR3_EXTI10_PC AFIO_EXTICR3_EXTI10_PC_Msk /*!< PC[10] pin */ +#define AFIO_EXTICR3_EXTI10_PD_Pos (8U) +#define AFIO_EXTICR3_EXTI10_PD_Msk (0x3UL << AFIO_EXTICR3_EXTI10_PD_Pos) /*!< 0x00000300 */ +#define AFIO_EXTICR3_EXTI10_PD AFIO_EXTICR3_EXTI10_PD_Msk /*!< PD[10] pin */ +#define AFIO_EXTICR3_EXTI10_PE_Pos (10U) +#define AFIO_EXTICR3_EXTI10_PE_Msk (0x1UL << AFIO_EXTICR3_EXTI10_PE_Pos) /*!< 0x00000400 */ +#define AFIO_EXTICR3_EXTI10_PE AFIO_EXTICR3_EXTI10_PE_Msk /*!< PE[10] pin */ +#define AFIO_EXTICR3_EXTI10_PF_Pos (8U) +#define AFIO_EXTICR3_EXTI10_PF_Msk (0x5UL << AFIO_EXTICR3_EXTI10_PF_Pos) /*!< 0x00000500 */ +#define AFIO_EXTICR3_EXTI10_PF AFIO_EXTICR3_EXTI10_PF_Msk /*!< PF[10] pin */ +#define AFIO_EXTICR3_EXTI10_PG_Pos (9U) +#define AFIO_EXTICR3_EXTI10_PG_Msk (0x3UL << AFIO_EXTICR3_EXTI10_PG_Pos) /*!< 0x00000600 */ +#define AFIO_EXTICR3_EXTI10_PG AFIO_EXTICR3_EXTI10_PG_Msk /*!< PG[10] pin */ + +/*!< EXTI11 configuration */ +#define AFIO_EXTICR3_EXTI11_PA 0x00000000U /*!< PA[11] pin */ +#define AFIO_EXTICR3_EXTI11_PB_Pos (12U) +#define AFIO_EXTICR3_EXTI11_PB_Msk (0x1UL << AFIO_EXTICR3_EXTI11_PB_Pos) /*!< 0x00001000 */ +#define AFIO_EXTICR3_EXTI11_PB AFIO_EXTICR3_EXTI11_PB_Msk /*!< PB[11] pin */ +#define AFIO_EXTICR3_EXTI11_PC_Pos (13U) +#define AFIO_EXTICR3_EXTI11_PC_Msk (0x1UL << AFIO_EXTICR3_EXTI11_PC_Pos) /*!< 0x00002000 */ +#define AFIO_EXTICR3_EXTI11_PC AFIO_EXTICR3_EXTI11_PC_Msk /*!< PC[11] pin */ +#define AFIO_EXTICR3_EXTI11_PD_Pos (12U) +#define AFIO_EXTICR3_EXTI11_PD_Msk (0x3UL << AFIO_EXTICR3_EXTI11_PD_Pos) /*!< 0x00003000 */ +#define AFIO_EXTICR3_EXTI11_PD AFIO_EXTICR3_EXTI11_PD_Msk /*!< PD[11] pin */ +#define AFIO_EXTICR3_EXTI11_PE_Pos (14U) +#define AFIO_EXTICR3_EXTI11_PE_Msk (0x1UL << AFIO_EXTICR3_EXTI11_PE_Pos) /*!< 0x00004000 */ +#define AFIO_EXTICR3_EXTI11_PE AFIO_EXTICR3_EXTI11_PE_Msk /*!< PE[11] pin */ +#define AFIO_EXTICR3_EXTI11_PF_Pos (12U) +#define AFIO_EXTICR3_EXTI11_PF_Msk (0x5UL << AFIO_EXTICR3_EXTI11_PF_Pos) /*!< 0x00005000 */ +#define AFIO_EXTICR3_EXTI11_PF AFIO_EXTICR3_EXTI11_PF_Msk /*!< PF[11] pin */ +#define AFIO_EXTICR3_EXTI11_PG_Pos (13U) +#define AFIO_EXTICR3_EXTI11_PG_Msk (0x3UL << AFIO_EXTICR3_EXTI11_PG_Pos) /*!< 0x00006000 */ +#define AFIO_EXTICR3_EXTI11_PG AFIO_EXTICR3_EXTI11_PG_Msk /*!< PG[11] pin */ + +/***************** Bit definition for AFIO_EXTICR4 register *****************/ +#define AFIO_EXTICR4_EXTI12_Pos (0U) +#define AFIO_EXTICR4_EXTI12_Msk (0xFUL << AFIO_EXTICR4_EXTI12_Pos) /*!< 0x0000000F */ +#define AFIO_EXTICR4_EXTI12 AFIO_EXTICR4_EXTI12_Msk /*!< EXTI 12 configuration */ +#define AFIO_EXTICR4_EXTI13_Pos (4U) +#define AFIO_EXTICR4_EXTI13_Msk (0xFUL << AFIO_EXTICR4_EXTI13_Pos) /*!< 0x000000F0 */ +#define AFIO_EXTICR4_EXTI13 AFIO_EXTICR4_EXTI13_Msk /*!< EXTI 13 configuration */ +#define AFIO_EXTICR4_EXTI14_Pos (8U) +#define AFIO_EXTICR4_EXTI14_Msk (0xFUL << AFIO_EXTICR4_EXTI14_Pos) /*!< 0x00000F00 */ +#define AFIO_EXTICR4_EXTI14 AFIO_EXTICR4_EXTI14_Msk /*!< EXTI 14 configuration */ +#define AFIO_EXTICR4_EXTI15_Pos (12U) +#define AFIO_EXTICR4_EXTI15_Msk (0xFUL << AFIO_EXTICR4_EXTI15_Pos) /*!< 0x0000F000 */ +#define AFIO_EXTICR4_EXTI15 AFIO_EXTICR4_EXTI15_Msk /*!< EXTI 15 configuration */ + +/* EXTI12 configuration */ +#define AFIO_EXTICR4_EXTI12_PA 0x00000000U /*!< PA[12] pin */ +#define AFIO_EXTICR4_EXTI12_PB_Pos (0U) +#define AFIO_EXTICR4_EXTI12_PB_Msk (0x1UL << AFIO_EXTICR4_EXTI12_PB_Pos) /*!< 0x00000001 */ +#define AFIO_EXTICR4_EXTI12_PB AFIO_EXTICR4_EXTI12_PB_Msk /*!< PB[12] pin */ +#define AFIO_EXTICR4_EXTI12_PC_Pos (1U) +#define AFIO_EXTICR4_EXTI12_PC_Msk (0x1UL << AFIO_EXTICR4_EXTI12_PC_Pos) /*!< 0x00000002 */ +#define AFIO_EXTICR4_EXTI12_PC AFIO_EXTICR4_EXTI12_PC_Msk /*!< PC[12] pin */ +#define AFIO_EXTICR4_EXTI12_PD_Pos (0U) +#define AFIO_EXTICR4_EXTI12_PD_Msk (0x3UL << AFIO_EXTICR4_EXTI12_PD_Pos) /*!< 0x00000003 */ +#define AFIO_EXTICR4_EXTI12_PD AFIO_EXTICR4_EXTI12_PD_Msk /*!< PD[12] pin */ +#define AFIO_EXTICR4_EXTI12_PE_Pos (2U) +#define AFIO_EXTICR4_EXTI12_PE_Msk (0x1UL << AFIO_EXTICR4_EXTI12_PE_Pos) /*!< 0x00000004 */ +#define AFIO_EXTICR4_EXTI12_PE AFIO_EXTICR4_EXTI12_PE_Msk /*!< PE[12] pin */ +#define AFIO_EXTICR4_EXTI12_PF_Pos (0U) +#define AFIO_EXTICR4_EXTI12_PF_Msk (0x5UL << AFIO_EXTICR4_EXTI12_PF_Pos) /*!< 0x00000005 */ +#define AFIO_EXTICR4_EXTI12_PF AFIO_EXTICR4_EXTI12_PF_Msk /*!< PF[12] pin */ +#define AFIO_EXTICR4_EXTI12_PG_Pos (1U) +#define AFIO_EXTICR4_EXTI12_PG_Msk (0x3UL << AFIO_EXTICR4_EXTI12_PG_Pos) /*!< 0x00000006 */ +#define AFIO_EXTICR4_EXTI12_PG AFIO_EXTICR4_EXTI12_PG_Msk /*!< PG[12] pin */ + +/* EXTI13 configuration */ +#define AFIO_EXTICR4_EXTI13_PA 0x00000000U /*!< PA[13] pin */ +#define AFIO_EXTICR4_EXTI13_PB_Pos (4U) +#define AFIO_EXTICR4_EXTI13_PB_Msk (0x1UL << AFIO_EXTICR4_EXTI13_PB_Pos) /*!< 0x00000010 */ +#define AFIO_EXTICR4_EXTI13_PB AFIO_EXTICR4_EXTI13_PB_Msk /*!< PB[13] pin */ +#define AFIO_EXTICR4_EXTI13_PC_Pos (5U) +#define AFIO_EXTICR4_EXTI13_PC_Msk (0x1UL << AFIO_EXTICR4_EXTI13_PC_Pos) /*!< 0x00000020 */ +#define AFIO_EXTICR4_EXTI13_PC AFIO_EXTICR4_EXTI13_PC_Msk /*!< PC[13] pin */ +#define AFIO_EXTICR4_EXTI13_PD_Pos (4U) +#define AFIO_EXTICR4_EXTI13_PD_Msk (0x3UL << AFIO_EXTICR4_EXTI13_PD_Pos) /*!< 0x00000030 */ +#define AFIO_EXTICR4_EXTI13_PD AFIO_EXTICR4_EXTI13_PD_Msk /*!< PD[13] pin */ +#define AFIO_EXTICR4_EXTI13_PE_Pos (6U) +#define AFIO_EXTICR4_EXTI13_PE_Msk (0x1UL << AFIO_EXTICR4_EXTI13_PE_Pos) /*!< 0x00000040 */ +#define AFIO_EXTICR4_EXTI13_PE AFIO_EXTICR4_EXTI13_PE_Msk /*!< PE[13] pin */ +#define AFIO_EXTICR4_EXTI13_PF_Pos (4U) +#define AFIO_EXTICR4_EXTI13_PF_Msk (0x5UL << AFIO_EXTICR4_EXTI13_PF_Pos) /*!< 0x00000050 */ +#define AFIO_EXTICR4_EXTI13_PF AFIO_EXTICR4_EXTI13_PF_Msk /*!< PF[13] pin */ +#define AFIO_EXTICR4_EXTI13_PG_Pos (5U) +#define AFIO_EXTICR4_EXTI13_PG_Msk (0x3UL << AFIO_EXTICR4_EXTI13_PG_Pos) /*!< 0x00000060 */ +#define AFIO_EXTICR4_EXTI13_PG AFIO_EXTICR4_EXTI13_PG_Msk /*!< PG[13] pin */ + +/*!< EXTI14 configuration */ +#define AFIO_EXTICR4_EXTI14_PA 0x00000000U /*!< PA[14] pin */ +#define AFIO_EXTICR4_EXTI14_PB_Pos (8U) +#define AFIO_EXTICR4_EXTI14_PB_Msk (0x1UL << AFIO_EXTICR4_EXTI14_PB_Pos) /*!< 0x00000100 */ +#define AFIO_EXTICR4_EXTI14_PB AFIO_EXTICR4_EXTI14_PB_Msk /*!< PB[14] pin */ +#define AFIO_EXTICR4_EXTI14_PC_Pos (9U) +#define AFIO_EXTICR4_EXTI14_PC_Msk (0x1UL << AFIO_EXTICR4_EXTI14_PC_Pos) /*!< 0x00000200 */ +#define AFIO_EXTICR4_EXTI14_PC AFIO_EXTICR4_EXTI14_PC_Msk /*!< PC[14] pin */ +#define AFIO_EXTICR4_EXTI14_PD_Pos (8U) +#define AFIO_EXTICR4_EXTI14_PD_Msk (0x3UL << AFIO_EXTICR4_EXTI14_PD_Pos) /*!< 0x00000300 */ +#define AFIO_EXTICR4_EXTI14_PD AFIO_EXTICR4_EXTI14_PD_Msk /*!< PD[14] pin */ +#define AFIO_EXTICR4_EXTI14_PE_Pos (10U) +#define AFIO_EXTICR4_EXTI14_PE_Msk (0x1UL << AFIO_EXTICR4_EXTI14_PE_Pos) /*!< 0x00000400 */ +#define AFIO_EXTICR4_EXTI14_PE AFIO_EXTICR4_EXTI14_PE_Msk /*!< PE[14] pin */ +#define AFIO_EXTICR4_EXTI14_PF_Pos (8U) +#define AFIO_EXTICR4_EXTI14_PF_Msk (0x5UL << AFIO_EXTICR4_EXTI14_PF_Pos) /*!< 0x00000500 */ +#define AFIO_EXTICR4_EXTI14_PF AFIO_EXTICR4_EXTI14_PF_Msk /*!< PF[14] pin */ +#define AFIO_EXTICR4_EXTI14_PG_Pos (9U) +#define AFIO_EXTICR4_EXTI14_PG_Msk (0x3UL << AFIO_EXTICR4_EXTI14_PG_Pos) /*!< 0x00000600 */ +#define AFIO_EXTICR4_EXTI14_PG AFIO_EXTICR4_EXTI14_PG_Msk /*!< PG[14] pin */ + +/*!< EXTI15 configuration */ +#define AFIO_EXTICR4_EXTI15_PA 0x00000000U /*!< PA[15] pin */ +#define AFIO_EXTICR4_EXTI15_PB_Pos (12U) +#define AFIO_EXTICR4_EXTI15_PB_Msk (0x1UL << AFIO_EXTICR4_EXTI15_PB_Pos) /*!< 0x00001000 */ +#define AFIO_EXTICR4_EXTI15_PB AFIO_EXTICR4_EXTI15_PB_Msk /*!< PB[15] pin */ +#define AFIO_EXTICR4_EXTI15_PC_Pos (13U) +#define AFIO_EXTICR4_EXTI15_PC_Msk (0x1UL << AFIO_EXTICR4_EXTI15_PC_Pos) /*!< 0x00002000 */ +#define AFIO_EXTICR4_EXTI15_PC AFIO_EXTICR4_EXTI15_PC_Msk /*!< PC[15] pin */ +#define AFIO_EXTICR4_EXTI15_PD_Pos (12U) +#define AFIO_EXTICR4_EXTI15_PD_Msk (0x3UL << AFIO_EXTICR4_EXTI15_PD_Pos) /*!< 0x00003000 */ +#define AFIO_EXTICR4_EXTI15_PD AFIO_EXTICR4_EXTI15_PD_Msk /*!< PD[15] pin */ +#define AFIO_EXTICR4_EXTI15_PE_Pos (14U) +#define AFIO_EXTICR4_EXTI15_PE_Msk (0x1UL << AFIO_EXTICR4_EXTI15_PE_Pos) /*!< 0x00004000 */ +#define AFIO_EXTICR4_EXTI15_PE AFIO_EXTICR4_EXTI15_PE_Msk /*!< PE[15] pin */ +#define AFIO_EXTICR4_EXTI15_PF_Pos (12U) +#define AFIO_EXTICR4_EXTI15_PF_Msk (0x5UL << AFIO_EXTICR4_EXTI15_PF_Pos) /*!< 0x00005000 */ +#define AFIO_EXTICR4_EXTI15_PF AFIO_EXTICR4_EXTI15_PF_Msk /*!< PF[15] pin */ +#define AFIO_EXTICR4_EXTI15_PG_Pos (13U) +#define AFIO_EXTICR4_EXTI15_PG_Msk (0x3UL << AFIO_EXTICR4_EXTI15_PG_Pos) /*!< 0x00006000 */ +#define AFIO_EXTICR4_EXTI15_PG AFIO_EXTICR4_EXTI15_PG_Msk /*!< PG[15] pin */ + +/****************** Bit definition for AFIO_MAPR2 register ******************/ + + + +/******************************************************************************/ +/* */ +/* External Interrupt/Event Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for EXTI_IMR register *******************/ +#define EXTI_IMR_MR0_Pos (0U) +#define EXTI_IMR_MR0_Msk (0x1UL << EXTI_IMR_MR0_Pos) /*!< 0x00000001 */ +#define EXTI_IMR_MR0 EXTI_IMR_MR0_Msk /*!< Interrupt Mask on line 0 */ +#define EXTI_IMR_MR1_Pos (1U) +#define EXTI_IMR_MR1_Msk (0x1UL << EXTI_IMR_MR1_Pos) /*!< 0x00000002 */ +#define EXTI_IMR_MR1 EXTI_IMR_MR1_Msk /*!< Interrupt Mask on line 1 */ +#define EXTI_IMR_MR2_Pos (2U) +#define EXTI_IMR_MR2_Msk (0x1UL << EXTI_IMR_MR2_Pos) /*!< 0x00000004 */ +#define EXTI_IMR_MR2 EXTI_IMR_MR2_Msk /*!< Interrupt Mask on line 2 */ +#define EXTI_IMR_MR3_Pos (3U) +#define EXTI_IMR_MR3_Msk (0x1UL << EXTI_IMR_MR3_Pos) /*!< 0x00000008 */ +#define EXTI_IMR_MR3 EXTI_IMR_MR3_Msk /*!< Interrupt Mask on line 3 */ +#define EXTI_IMR_MR4_Pos (4U) +#define EXTI_IMR_MR4_Msk (0x1UL << EXTI_IMR_MR4_Pos) /*!< 0x00000010 */ +#define EXTI_IMR_MR4 EXTI_IMR_MR4_Msk /*!< Interrupt Mask on line 4 */ +#define EXTI_IMR_MR5_Pos (5U) +#define EXTI_IMR_MR5_Msk (0x1UL << EXTI_IMR_MR5_Pos) /*!< 0x00000020 */ +#define EXTI_IMR_MR5 EXTI_IMR_MR5_Msk /*!< Interrupt Mask on line 5 */ +#define EXTI_IMR_MR6_Pos (6U) +#define EXTI_IMR_MR6_Msk (0x1UL << EXTI_IMR_MR6_Pos) /*!< 0x00000040 */ +#define EXTI_IMR_MR6 EXTI_IMR_MR6_Msk /*!< Interrupt Mask on line 6 */ +#define EXTI_IMR_MR7_Pos (7U) +#define EXTI_IMR_MR7_Msk (0x1UL << EXTI_IMR_MR7_Pos) /*!< 0x00000080 */ +#define EXTI_IMR_MR7 EXTI_IMR_MR7_Msk /*!< Interrupt Mask on line 7 */ +#define EXTI_IMR_MR8_Pos (8U) +#define EXTI_IMR_MR8_Msk (0x1UL << EXTI_IMR_MR8_Pos) /*!< 0x00000100 */ +#define EXTI_IMR_MR8 EXTI_IMR_MR8_Msk /*!< Interrupt Mask on line 8 */ +#define EXTI_IMR_MR9_Pos (9U) +#define EXTI_IMR_MR9_Msk (0x1UL << EXTI_IMR_MR9_Pos) /*!< 0x00000200 */ +#define EXTI_IMR_MR9 EXTI_IMR_MR9_Msk /*!< Interrupt Mask on line 9 */ +#define EXTI_IMR_MR10_Pos (10U) +#define EXTI_IMR_MR10_Msk (0x1UL << EXTI_IMR_MR10_Pos) /*!< 0x00000400 */ +#define EXTI_IMR_MR10 EXTI_IMR_MR10_Msk /*!< Interrupt Mask on line 10 */ +#define EXTI_IMR_MR11_Pos (11U) +#define EXTI_IMR_MR11_Msk (0x1UL << EXTI_IMR_MR11_Pos) /*!< 0x00000800 */ +#define EXTI_IMR_MR11 EXTI_IMR_MR11_Msk /*!< Interrupt Mask on line 11 */ +#define EXTI_IMR_MR12_Pos (12U) +#define EXTI_IMR_MR12_Msk (0x1UL << EXTI_IMR_MR12_Pos) /*!< 0x00001000 */ +#define EXTI_IMR_MR12 EXTI_IMR_MR12_Msk /*!< Interrupt Mask on line 12 */ +#define EXTI_IMR_MR13_Pos (13U) +#define EXTI_IMR_MR13_Msk (0x1UL << EXTI_IMR_MR13_Pos) /*!< 0x00002000 */ +#define EXTI_IMR_MR13 EXTI_IMR_MR13_Msk /*!< Interrupt Mask on line 13 */ +#define EXTI_IMR_MR14_Pos (14U) +#define EXTI_IMR_MR14_Msk (0x1UL << EXTI_IMR_MR14_Pos) /*!< 0x00004000 */ +#define EXTI_IMR_MR14 EXTI_IMR_MR14_Msk /*!< Interrupt Mask on line 14 */ +#define EXTI_IMR_MR15_Pos (15U) +#define EXTI_IMR_MR15_Msk (0x1UL << EXTI_IMR_MR15_Pos) /*!< 0x00008000 */ +#define EXTI_IMR_MR15 EXTI_IMR_MR15_Msk /*!< Interrupt Mask on line 15 */ +#define EXTI_IMR_MR16_Pos (16U) +#define EXTI_IMR_MR16_Msk (0x1UL << EXTI_IMR_MR16_Pos) /*!< 0x00010000 */ +#define EXTI_IMR_MR16 EXTI_IMR_MR16_Msk /*!< Interrupt Mask on line 16 */ +#define EXTI_IMR_MR17_Pos (17U) +#define EXTI_IMR_MR17_Msk (0x1UL << EXTI_IMR_MR17_Pos) /*!< 0x00020000 */ +#define EXTI_IMR_MR17 EXTI_IMR_MR17_Msk /*!< Interrupt Mask on line 17 */ +#define EXTI_IMR_MR18_Pos (18U) +#define EXTI_IMR_MR18_Msk (0x1UL << EXTI_IMR_MR18_Pos) /*!< 0x00040000 */ +#define EXTI_IMR_MR18 EXTI_IMR_MR18_Msk /*!< Interrupt Mask on line 18 */ + +/* References Defines */ +#define EXTI_IMR_IM0 EXTI_IMR_MR0 +#define EXTI_IMR_IM1 EXTI_IMR_MR1 +#define EXTI_IMR_IM2 EXTI_IMR_MR2 +#define EXTI_IMR_IM3 EXTI_IMR_MR3 +#define EXTI_IMR_IM4 EXTI_IMR_MR4 +#define EXTI_IMR_IM5 EXTI_IMR_MR5 +#define EXTI_IMR_IM6 EXTI_IMR_MR6 +#define EXTI_IMR_IM7 EXTI_IMR_MR7 +#define EXTI_IMR_IM8 EXTI_IMR_MR8 +#define EXTI_IMR_IM9 EXTI_IMR_MR9 +#define EXTI_IMR_IM10 EXTI_IMR_MR10 +#define EXTI_IMR_IM11 EXTI_IMR_MR11 +#define EXTI_IMR_IM12 EXTI_IMR_MR12 +#define EXTI_IMR_IM13 EXTI_IMR_MR13 +#define EXTI_IMR_IM14 EXTI_IMR_MR14 +#define EXTI_IMR_IM15 EXTI_IMR_MR15 +#define EXTI_IMR_IM16 EXTI_IMR_MR16 +#define EXTI_IMR_IM17 EXTI_IMR_MR17 +#define EXTI_IMR_IM18 EXTI_IMR_MR18 +#define EXTI_IMR_IM 0x0007FFFFU /*!< Interrupt Mask All */ + +/******************* Bit definition for EXTI_EMR register *******************/ +#define EXTI_EMR_MR0_Pos (0U) +#define EXTI_EMR_MR0_Msk (0x1UL << EXTI_EMR_MR0_Pos) /*!< 0x00000001 */ +#define EXTI_EMR_MR0 EXTI_EMR_MR0_Msk /*!< Event Mask on line 0 */ +#define EXTI_EMR_MR1_Pos (1U) +#define EXTI_EMR_MR1_Msk (0x1UL << EXTI_EMR_MR1_Pos) /*!< 0x00000002 */ +#define EXTI_EMR_MR1 EXTI_EMR_MR1_Msk /*!< Event Mask on line 1 */ +#define EXTI_EMR_MR2_Pos (2U) +#define EXTI_EMR_MR2_Msk (0x1UL << EXTI_EMR_MR2_Pos) /*!< 0x00000004 */ +#define EXTI_EMR_MR2 EXTI_EMR_MR2_Msk /*!< Event Mask on line 2 */ +#define EXTI_EMR_MR3_Pos (3U) +#define EXTI_EMR_MR3_Msk (0x1UL << EXTI_EMR_MR3_Pos) /*!< 0x00000008 */ +#define EXTI_EMR_MR3 EXTI_EMR_MR3_Msk /*!< Event Mask on line 3 */ +#define EXTI_EMR_MR4_Pos (4U) +#define EXTI_EMR_MR4_Msk (0x1UL << EXTI_EMR_MR4_Pos) /*!< 0x00000010 */ +#define EXTI_EMR_MR4 EXTI_EMR_MR4_Msk /*!< Event Mask on line 4 */ +#define EXTI_EMR_MR5_Pos (5U) +#define EXTI_EMR_MR5_Msk (0x1UL << EXTI_EMR_MR5_Pos) /*!< 0x00000020 */ +#define EXTI_EMR_MR5 EXTI_EMR_MR5_Msk /*!< Event Mask on line 5 */ +#define EXTI_EMR_MR6_Pos (6U) +#define EXTI_EMR_MR6_Msk (0x1UL << EXTI_EMR_MR6_Pos) /*!< 0x00000040 */ +#define EXTI_EMR_MR6 EXTI_EMR_MR6_Msk /*!< Event Mask on line 6 */ +#define EXTI_EMR_MR7_Pos (7U) +#define EXTI_EMR_MR7_Msk (0x1UL << EXTI_EMR_MR7_Pos) /*!< 0x00000080 */ +#define EXTI_EMR_MR7 EXTI_EMR_MR7_Msk /*!< Event Mask on line 7 */ +#define EXTI_EMR_MR8_Pos (8U) +#define EXTI_EMR_MR8_Msk (0x1UL << EXTI_EMR_MR8_Pos) /*!< 0x00000100 */ +#define EXTI_EMR_MR8 EXTI_EMR_MR8_Msk /*!< Event Mask on line 8 */ +#define EXTI_EMR_MR9_Pos (9U) +#define EXTI_EMR_MR9_Msk (0x1UL << EXTI_EMR_MR9_Pos) /*!< 0x00000200 */ +#define EXTI_EMR_MR9 EXTI_EMR_MR9_Msk /*!< Event Mask on line 9 */ +#define EXTI_EMR_MR10_Pos (10U) +#define EXTI_EMR_MR10_Msk (0x1UL << EXTI_EMR_MR10_Pos) /*!< 0x00000400 */ +#define EXTI_EMR_MR10 EXTI_EMR_MR10_Msk /*!< Event Mask on line 10 */ +#define EXTI_EMR_MR11_Pos (11U) +#define EXTI_EMR_MR11_Msk (0x1UL << EXTI_EMR_MR11_Pos) /*!< 0x00000800 */ +#define EXTI_EMR_MR11 EXTI_EMR_MR11_Msk /*!< Event Mask on line 11 */ +#define EXTI_EMR_MR12_Pos (12U) +#define EXTI_EMR_MR12_Msk (0x1UL << EXTI_EMR_MR12_Pos) /*!< 0x00001000 */ +#define EXTI_EMR_MR12 EXTI_EMR_MR12_Msk /*!< Event Mask on line 12 */ +#define EXTI_EMR_MR13_Pos (13U) +#define EXTI_EMR_MR13_Msk (0x1UL << EXTI_EMR_MR13_Pos) /*!< 0x00002000 */ +#define EXTI_EMR_MR13 EXTI_EMR_MR13_Msk /*!< Event Mask on line 13 */ +#define EXTI_EMR_MR14_Pos (14U) +#define EXTI_EMR_MR14_Msk (0x1UL << EXTI_EMR_MR14_Pos) /*!< 0x00004000 */ +#define EXTI_EMR_MR14 EXTI_EMR_MR14_Msk /*!< Event Mask on line 14 */ +#define EXTI_EMR_MR15_Pos (15U) +#define EXTI_EMR_MR15_Msk (0x1UL << EXTI_EMR_MR15_Pos) /*!< 0x00008000 */ +#define EXTI_EMR_MR15 EXTI_EMR_MR15_Msk /*!< Event Mask on line 15 */ +#define EXTI_EMR_MR16_Pos (16U) +#define EXTI_EMR_MR16_Msk (0x1UL << EXTI_EMR_MR16_Pos) /*!< 0x00010000 */ +#define EXTI_EMR_MR16 EXTI_EMR_MR16_Msk /*!< Event Mask on line 16 */ +#define EXTI_EMR_MR17_Pos (17U) +#define EXTI_EMR_MR17_Msk (0x1UL << EXTI_EMR_MR17_Pos) /*!< 0x00020000 */ +#define EXTI_EMR_MR17 EXTI_EMR_MR17_Msk /*!< Event Mask on line 17 */ +#define EXTI_EMR_MR18_Pos (18U) +#define EXTI_EMR_MR18_Msk (0x1UL << EXTI_EMR_MR18_Pos) /*!< 0x00040000 */ +#define EXTI_EMR_MR18 EXTI_EMR_MR18_Msk /*!< Event Mask on line 18 */ + +/* References Defines */ +#define EXTI_EMR_EM0 EXTI_EMR_MR0 +#define EXTI_EMR_EM1 EXTI_EMR_MR1 +#define EXTI_EMR_EM2 EXTI_EMR_MR2 +#define EXTI_EMR_EM3 EXTI_EMR_MR3 +#define EXTI_EMR_EM4 EXTI_EMR_MR4 +#define EXTI_EMR_EM5 EXTI_EMR_MR5 +#define EXTI_EMR_EM6 EXTI_EMR_MR6 +#define EXTI_EMR_EM7 EXTI_EMR_MR7 +#define EXTI_EMR_EM8 EXTI_EMR_MR8 +#define EXTI_EMR_EM9 EXTI_EMR_MR9 +#define EXTI_EMR_EM10 EXTI_EMR_MR10 +#define EXTI_EMR_EM11 EXTI_EMR_MR11 +#define EXTI_EMR_EM12 EXTI_EMR_MR12 +#define EXTI_EMR_EM13 EXTI_EMR_MR13 +#define EXTI_EMR_EM14 EXTI_EMR_MR14 +#define EXTI_EMR_EM15 EXTI_EMR_MR15 +#define EXTI_EMR_EM16 EXTI_EMR_MR16 +#define EXTI_EMR_EM17 EXTI_EMR_MR17 +#define EXTI_EMR_EM18 EXTI_EMR_MR18 + +/****************** Bit definition for EXTI_RTSR register *******************/ +#define EXTI_RTSR_TR0_Pos (0U) +#define EXTI_RTSR_TR0_Msk (0x1UL << EXTI_RTSR_TR0_Pos) /*!< 0x00000001 */ +#define EXTI_RTSR_TR0 EXTI_RTSR_TR0_Msk /*!< Rising trigger event configuration bit of line 0 */ +#define EXTI_RTSR_TR1_Pos (1U) +#define EXTI_RTSR_TR1_Msk (0x1UL << EXTI_RTSR_TR1_Pos) /*!< 0x00000002 */ +#define EXTI_RTSR_TR1 EXTI_RTSR_TR1_Msk /*!< Rising trigger event configuration bit of line 1 */ +#define EXTI_RTSR_TR2_Pos (2U) +#define EXTI_RTSR_TR2_Msk (0x1UL << EXTI_RTSR_TR2_Pos) /*!< 0x00000004 */ +#define EXTI_RTSR_TR2 EXTI_RTSR_TR2_Msk /*!< Rising trigger event configuration bit of line 2 */ +#define EXTI_RTSR_TR3_Pos (3U) +#define EXTI_RTSR_TR3_Msk (0x1UL << EXTI_RTSR_TR3_Pos) /*!< 0x00000008 */ +#define EXTI_RTSR_TR3 EXTI_RTSR_TR3_Msk /*!< Rising trigger event configuration bit of line 3 */ +#define EXTI_RTSR_TR4_Pos (4U) +#define EXTI_RTSR_TR4_Msk (0x1UL << EXTI_RTSR_TR4_Pos) /*!< 0x00000010 */ +#define EXTI_RTSR_TR4 EXTI_RTSR_TR4_Msk /*!< Rising trigger event configuration bit of line 4 */ +#define EXTI_RTSR_TR5_Pos (5U) +#define EXTI_RTSR_TR5_Msk (0x1UL << EXTI_RTSR_TR5_Pos) /*!< 0x00000020 */ +#define EXTI_RTSR_TR5 EXTI_RTSR_TR5_Msk /*!< Rising trigger event configuration bit of line 5 */ +#define EXTI_RTSR_TR6_Pos (6U) +#define EXTI_RTSR_TR6_Msk (0x1UL << EXTI_RTSR_TR6_Pos) /*!< 0x00000040 */ +#define EXTI_RTSR_TR6 EXTI_RTSR_TR6_Msk /*!< Rising trigger event configuration bit of line 6 */ +#define EXTI_RTSR_TR7_Pos (7U) +#define EXTI_RTSR_TR7_Msk (0x1UL << EXTI_RTSR_TR7_Pos) /*!< 0x00000080 */ +#define EXTI_RTSR_TR7 EXTI_RTSR_TR7_Msk /*!< Rising trigger event configuration bit of line 7 */ +#define EXTI_RTSR_TR8_Pos (8U) +#define EXTI_RTSR_TR8_Msk (0x1UL << EXTI_RTSR_TR8_Pos) /*!< 0x00000100 */ +#define EXTI_RTSR_TR8 EXTI_RTSR_TR8_Msk /*!< Rising trigger event configuration bit of line 8 */ +#define EXTI_RTSR_TR9_Pos (9U) +#define EXTI_RTSR_TR9_Msk (0x1UL << EXTI_RTSR_TR9_Pos) /*!< 0x00000200 */ +#define EXTI_RTSR_TR9 EXTI_RTSR_TR9_Msk /*!< Rising trigger event configuration bit of line 9 */ +#define EXTI_RTSR_TR10_Pos (10U) +#define EXTI_RTSR_TR10_Msk (0x1UL << EXTI_RTSR_TR10_Pos) /*!< 0x00000400 */ +#define EXTI_RTSR_TR10 EXTI_RTSR_TR10_Msk /*!< Rising trigger event configuration bit of line 10 */ +#define EXTI_RTSR_TR11_Pos (11U) +#define EXTI_RTSR_TR11_Msk (0x1UL << EXTI_RTSR_TR11_Pos) /*!< 0x00000800 */ +#define EXTI_RTSR_TR11 EXTI_RTSR_TR11_Msk /*!< Rising trigger event configuration bit of line 11 */ +#define EXTI_RTSR_TR12_Pos (12U) +#define EXTI_RTSR_TR12_Msk (0x1UL << EXTI_RTSR_TR12_Pos) /*!< 0x00001000 */ +#define EXTI_RTSR_TR12 EXTI_RTSR_TR12_Msk /*!< Rising trigger event configuration bit of line 12 */ +#define EXTI_RTSR_TR13_Pos (13U) +#define EXTI_RTSR_TR13_Msk (0x1UL << EXTI_RTSR_TR13_Pos) /*!< 0x00002000 */ +#define EXTI_RTSR_TR13 EXTI_RTSR_TR13_Msk /*!< Rising trigger event configuration bit of line 13 */ +#define EXTI_RTSR_TR14_Pos (14U) +#define EXTI_RTSR_TR14_Msk (0x1UL << EXTI_RTSR_TR14_Pos) /*!< 0x00004000 */ +#define EXTI_RTSR_TR14 EXTI_RTSR_TR14_Msk /*!< Rising trigger event configuration bit of line 14 */ +#define EXTI_RTSR_TR15_Pos (15U) +#define EXTI_RTSR_TR15_Msk (0x1UL << EXTI_RTSR_TR15_Pos) /*!< 0x00008000 */ +#define EXTI_RTSR_TR15 EXTI_RTSR_TR15_Msk /*!< Rising trigger event configuration bit of line 15 */ +#define EXTI_RTSR_TR16_Pos (16U) +#define EXTI_RTSR_TR16_Msk (0x1UL << EXTI_RTSR_TR16_Pos) /*!< 0x00010000 */ +#define EXTI_RTSR_TR16 EXTI_RTSR_TR16_Msk /*!< Rising trigger event configuration bit of line 16 */ +#define EXTI_RTSR_TR17_Pos (17U) +#define EXTI_RTSR_TR17_Msk (0x1UL << EXTI_RTSR_TR17_Pos) /*!< 0x00020000 */ +#define EXTI_RTSR_TR17 EXTI_RTSR_TR17_Msk /*!< Rising trigger event configuration bit of line 17 */ +#define EXTI_RTSR_TR18_Pos (18U) +#define EXTI_RTSR_TR18_Msk (0x1UL << EXTI_RTSR_TR18_Pos) /*!< 0x00040000 */ +#define EXTI_RTSR_TR18 EXTI_RTSR_TR18_Msk /*!< Rising trigger event configuration bit of line 18 */ + +/* References Defines */ +#define EXTI_RTSR_RT0 EXTI_RTSR_TR0 +#define EXTI_RTSR_RT1 EXTI_RTSR_TR1 +#define EXTI_RTSR_RT2 EXTI_RTSR_TR2 +#define EXTI_RTSR_RT3 EXTI_RTSR_TR3 +#define EXTI_RTSR_RT4 EXTI_RTSR_TR4 +#define EXTI_RTSR_RT5 EXTI_RTSR_TR5 +#define EXTI_RTSR_RT6 EXTI_RTSR_TR6 +#define EXTI_RTSR_RT7 EXTI_RTSR_TR7 +#define EXTI_RTSR_RT8 EXTI_RTSR_TR8 +#define EXTI_RTSR_RT9 EXTI_RTSR_TR9 +#define EXTI_RTSR_RT10 EXTI_RTSR_TR10 +#define EXTI_RTSR_RT11 EXTI_RTSR_TR11 +#define EXTI_RTSR_RT12 EXTI_RTSR_TR12 +#define EXTI_RTSR_RT13 EXTI_RTSR_TR13 +#define EXTI_RTSR_RT14 EXTI_RTSR_TR14 +#define EXTI_RTSR_RT15 EXTI_RTSR_TR15 +#define EXTI_RTSR_RT16 EXTI_RTSR_TR16 +#define EXTI_RTSR_RT17 EXTI_RTSR_TR17 +#define EXTI_RTSR_RT18 EXTI_RTSR_TR18 + +/****************** Bit definition for EXTI_FTSR register *******************/ +#define EXTI_FTSR_TR0_Pos (0U) +#define EXTI_FTSR_TR0_Msk (0x1UL << EXTI_FTSR_TR0_Pos) /*!< 0x00000001 */ +#define EXTI_FTSR_TR0 EXTI_FTSR_TR0_Msk /*!< Falling trigger event configuration bit of line 0 */ +#define EXTI_FTSR_TR1_Pos (1U) +#define EXTI_FTSR_TR1_Msk (0x1UL << EXTI_FTSR_TR1_Pos) /*!< 0x00000002 */ +#define EXTI_FTSR_TR1 EXTI_FTSR_TR1_Msk /*!< Falling trigger event configuration bit of line 1 */ +#define EXTI_FTSR_TR2_Pos (2U) +#define EXTI_FTSR_TR2_Msk (0x1UL << EXTI_FTSR_TR2_Pos) /*!< 0x00000004 */ +#define EXTI_FTSR_TR2 EXTI_FTSR_TR2_Msk /*!< Falling trigger event configuration bit of line 2 */ +#define EXTI_FTSR_TR3_Pos (3U) +#define EXTI_FTSR_TR3_Msk (0x1UL << EXTI_FTSR_TR3_Pos) /*!< 0x00000008 */ +#define EXTI_FTSR_TR3 EXTI_FTSR_TR3_Msk /*!< Falling trigger event configuration bit of line 3 */ +#define EXTI_FTSR_TR4_Pos (4U) +#define EXTI_FTSR_TR4_Msk (0x1UL << EXTI_FTSR_TR4_Pos) /*!< 0x00000010 */ +#define EXTI_FTSR_TR4 EXTI_FTSR_TR4_Msk /*!< Falling trigger event configuration bit of line 4 */ +#define EXTI_FTSR_TR5_Pos (5U) +#define EXTI_FTSR_TR5_Msk (0x1UL << EXTI_FTSR_TR5_Pos) /*!< 0x00000020 */ +#define EXTI_FTSR_TR5 EXTI_FTSR_TR5_Msk /*!< Falling trigger event configuration bit of line 5 */ +#define EXTI_FTSR_TR6_Pos (6U) +#define EXTI_FTSR_TR6_Msk (0x1UL << EXTI_FTSR_TR6_Pos) /*!< 0x00000040 */ +#define EXTI_FTSR_TR6 EXTI_FTSR_TR6_Msk /*!< Falling trigger event configuration bit of line 6 */ +#define EXTI_FTSR_TR7_Pos (7U) +#define EXTI_FTSR_TR7_Msk (0x1UL << EXTI_FTSR_TR7_Pos) /*!< 0x00000080 */ +#define EXTI_FTSR_TR7 EXTI_FTSR_TR7_Msk /*!< Falling trigger event configuration bit of line 7 */ +#define EXTI_FTSR_TR8_Pos (8U) +#define EXTI_FTSR_TR8_Msk (0x1UL << EXTI_FTSR_TR8_Pos) /*!< 0x00000100 */ +#define EXTI_FTSR_TR8 EXTI_FTSR_TR8_Msk /*!< Falling trigger event configuration bit of line 8 */ +#define EXTI_FTSR_TR9_Pos (9U) +#define EXTI_FTSR_TR9_Msk (0x1UL << EXTI_FTSR_TR9_Pos) /*!< 0x00000200 */ +#define EXTI_FTSR_TR9 EXTI_FTSR_TR9_Msk /*!< Falling trigger event configuration bit of line 9 */ +#define EXTI_FTSR_TR10_Pos (10U) +#define EXTI_FTSR_TR10_Msk (0x1UL << EXTI_FTSR_TR10_Pos) /*!< 0x00000400 */ +#define EXTI_FTSR_TR10 EXTI_FTSR_TR10_Msk /*!< Falling trigger event configuration bit of line 10 */ +#define EXTI_FTSR_TR11_Pos (11U) +#define EXTI_FTSR_TR11_Msk (0x1UL << EXTI_FTSR_TR11_Pos) /*!< 0x00000800 */ +#define EXTI_FTSR_TR11 EXTI_FTSR_TR11_Msk /*!< Falling trigger event configuration bit of line 11 */ +#define EXTI_FTSR_TR12_Pos (12U) +#define EXTI_FTSR_TR12_Msk (0x1UL << EXTI_FTSR_TR12_Pos) /*!< 0x00001000 */ +#define EXTI_FTSR_TR12 EXTI_FTSR_TR12_Msk /*!< Falling trigger event configuration bit of line 12 */ +#define EXTI_FTSR_TR13_Pos (13U) +#define EXTI_FTSR_TR13_Msk (0x1UL << EXTI_FTSR_TR13_Pos) /*!< 0x00002000 */ +#define EXTI_FTSR_TR13 EXTI_FTSR_TR13_Msk /*!< Falling trigger event configuration bit of line 13 */ +#define EXTI_FTSR_TR14_Pos (14U) +#define EXTI_FTSR_TR14_Msk (0x1UL << EXTI_FTSR_TR14_Pos) /*!< 0x00004000 */ +#define EXTI_FTSR_TR14 EXTI_FTSR_TR14_Msk /*!< Falling trigger event configuration bit of line 14 */ +#define EXTI_FTSR_TR15_Pos (15U) +#define EXTI_FTSR_TR15_Msk (0x1UL << EXTI_FTSR_TR15_Pos) /*!< 0x00008000 */ +#define EXTI_FTSR_TR15 EXTI_FTSR_TR15_Msk /*!< Falling trigger event configuration bit of line 15 */ +#define EXTI_FTSR_TR16_Pos (16U) +#define EXTI_FTSR_TR16_Msk (0x1UL << EXTI_FTSR_TR16_Pos) /*!< 0x00010000 */ +#define EXTI_FTSR_TR16 EXTI_FTSR_TR16_Msk /*!< Falling trigger event configuration bit of line 16 */ +#define EXTI_FTSR_TR17_Pos (17U) +#define EXTI_FTSR_TR17_Msk (0x1UL << EXTI_FTSR_TR17_Pos) /*!< 0x00020000 */ +#define EXTI_FTSR_TR17 EXTI_FTSR_TR17_Msk /*!< Falling trigger event configuration bit of line 17 */ +#define EXTI_FTSR_TR18_Pos (18U) +#define EXTI_FTSR_TR18_Msk (0x1UL << EXTI_FTSR_TR18_Pos) /*!< 0x00040000 */ +#define EXTI_FTSR_TR18 EXTI_FTSR_TR18_Msk /*!< Falling trigger event configuration bit of line 18 */ + +/* References Defines */ +#define EXTI_FTSR_FT0 EXTI_FTSR_TR0 +#define EXTI_FTSR_FT1 EXTI_FTSR_TR1 +#define EXTI_FTSR_FT2 EXTI_FTSR_TR2 +#define EXTI_FTSR_FT3 EXTI_FTSR_TR3 +#define EXTI_FTSR_FT4 EXTI_FTSR_TR4 +#define EXTI_FTSR_FT5 EXTI_FTSR_TR5 +#define EXTI_FTSR_FT6 EXTI_FTSR_TR6 +#define EXTI_FTSR_FT7 EXTI_FTSR_TR7 +#define EXTI_FTSR_FT8 EXTI_FTSR_TR8 +#define EXTI_FTSR_FT9 EXTI_FTSR_TR9 +#define EXTI_FTSR_FT10 EXTI_FTSR_TR10 +#define EXTI_FTSR_FT11 EXTI_FTSR_TR11 +#define EXTI_FTSR_FT12 EXTI_FTSR_TR12 +#define EXTI_FTSR_FT13 EXTI_FTSR_TR13 +#define EXTI_FTSR_FT14 EXTI_FTSR_TR14 +#define EXTI_FTSR_FT15 EXTI_FTSR_TR15 +#define EXTI_FTSR_FT16 EXTI_FTSR_TR16 +#define EXTI_FTSR_FT17 EXTI_FTSR_TR17 +#define EXTI_FTSR_FT18 EXTI_FTSR_TR18 + +/****************** Bit definition for EXTI_SWIER register ******************/ +#define EXTI_SWIER_SWIER0_Pos (0U) +#define EXTI_SWIER_SWIER0_Msk (0x1UL << EXTI_SWIER_SWIER0_Pos) /*!< 0x00000001 */ +#define EXTI_SWIER_SWIER0 EXTI_SWIER_SWIER0_Msk /*!< Software Interrupt on line 0 */ +#define EXTI_SWIER_SWIER1_Pos (1U) +#define EXTI_SWIER_SWIER1_Msk (0x1UL << EXTI_SWIER_SWIER1_Pos) /*!< 0x00000002 */ +#define EXTI_SWIER_SWIER1 EXTI_SWIER_SWIER1_Msk /*!< Software Interrupt on line 1 */ +#define EXTI_SWIER_SWIER2_Pos (2U) +#define EXTI_SWIER_SWIER2_Msk (0x1UL << EXTI_SWIER_SWIER2_Pos) /*!< 0x00000004 */ +#define EXTI_SWIER_SWIER2 EXTI_SWIER_SWIER2_Msk /*!< Software Interrupt on line 2 */ +#define EXTI_SWIER_SWIER3_Pos (3U) +#define EXTI_SWIER_SWIER3_Msk (0x1UL << EXTI_SWIER_SWIER3_Pos) /*!< 0x00000008 */ +#define EXTI_SWIER_SWIER3 EXTI_SWIER_SWIER3_Msk /*!< Software Interrupt on line 3 */ +#define EXTI_SWIER_SWIER4_Pos (4U) +#define EXTI_SWIER_SWIER4_Msk (0x1UL << EXTI_SWIER_SWIER4_Pos) /*!< 0x00000010 */ +#define EXTI_SWIER_SWIER4 EXTI_SWIER_SWIER4_Msk /*!< Software Interrupt on line 4 */ +#define EXTI_SWIER_SWIER5_Pos (5U) +#define EXTI_SWIER_SWIER5_Msk (0x1UL << EXTI_SWIER_SWIER5_Pos) /*!< 0x00000020 */ +#define EXTI_SWIER_SWIER5 EXTI_SWIER_SWIER5_Msk /*!< Software Interrupt on line 5 */ +#define EXTI_SWIER_SWIER6_Pos (6U) +#define EXTI_SWIER_SWIER6_Msk (0x1UL << EXTI_SWIER_SWIER6_Pos) /*!< 0x00000040 */ +#define EXTI_SWIER_SWIER6 EXTI_SWIER_SWIER6_Msk /*!< Software Interrupt on line 6 */ +#define EXTI_SWIER_SWIER7_Pos (7U) +#define EXTI_SWIER_SWIER7_Msk (0x1UL << EXTI_SWIER_SWIER7_Pos) /*!< 0x00000080 */ +#define EXTI_SWIER_SWIER7 EXTI_SWIER_SWIER7_Msk /*!< Software Interrupt on line 7 */ +#define EXTI_SWIER_SWIER8_Pos (8U) +#define EXTI_SWIER_SWIER8_Msk (0x1UL << EXTI_SWIER_SWIER8_Pos) /*!< 0x00000100 */ +#define EXTI_SWIER_SWIER8 EXTI_SWIER_SWIER8_Msk /*!< Software Interrupt on line 8 */ +#define EXTI_SWIER_SWIER9_Pos (9U) +#define EXTI_SWIER_SWIER9_Msk (0x1UL << EXTI_SWIER_SWIER9_Pos) /*!< 0x00000200 */ +#define EXTI_SWIER_SWIER9 EXTI_SWIER_SWIER9_Msk /*!< Software Interrupt on line 9 */ +#define EXTI_SWIER_SWIER10_Pos (10U) +#define EXTI_SWIER_SWIER10_Msk (0x1UL << EXTI_SWIER_SWIER10_Pos) /*!< 0x00000400 */ +#define EXTI_SWIER_SWIER10 EXTI_SWIER_SWIER10_Msk /*!< Software Interrupt on line 10 */ +#define EXTI_SWIER_SWIER11_Pos (11U) +#define EXTI_SWIER_SWIER11_Msk (0x1UL << EXTI_SWIER_SWIER11_Pos) /*!< 0x00000800 */ +#define EXTI_SWIER_SWIER11 EXTI_SWIER_SWIER11_Msk /*!< Software Interrupt on line 11 */ +#define EXTI_SWIER_SWIER12_Pos (12U) +#define EXTI_SWIER_SWIER12_Msk (0x1UL << EXTI_SWIER_SWIER12_Pos) /*!< 0x00001000 */ +#define EXTI_SWIER_SWIER12 EXTI_SWIER_SWIER12_Msk /*!< Software Interrupt on line 12 */ +#define EXTI_SWIER_SWIER13_Pos (13U) +#define EXTI_SWIER_SWIER13_Msk (0x1UL << EXTI_SWIER_SWIER13_Pos) /*!< 0x00002000 */ +#define EXTI_SWIER_SWIER13 EXTI_SWIER_SWIER13_Msk /*!< Software Interrupt on line 13 */ +#define EXTI_SWIER_SWIER14_Pos (14U) +#define EXTI_SWIER_SWIER14_Msk (0x1UL << EXTI_SWIER_SWIER14_Pos) /*!< 0x00004000 */ +#define EXTI_SWIER_SWIER14 EXTI_SWIER_SWIER14_Msk /*!< Software Interrupt on line 14 */ +#define EXTI_SWIER_SWIER15_Pos (15U) +#define EXTI_SWIER_SWIER15_Msk (0x1UL << EXTI_SWIER_SWIER15_Pos) /*!< 0x00008000 */ +#define EXTI_SWIER_SWIER15 EXTI_SWIER_SWIER15_Msk /*!< Software Interrupt on line 15 */ +#define EXTI_SWIER_SWIER16_Pos (16U) +#define EXTI_SWIER_SWIER16_Msk (0x1UL << EXTI_SWIER_SWIER16_Pos) /*!< 0x00010000 */ +#define EXTI_SWIER_SWIER16 EXTI_SWIER_SWIER16_Msk /*!< Software Interrupt on line 16 */ +#define EXTI_SWIER_SWIER17_Pos (17U) +#define EXTI_SWIER_SWIER17_Msk (0x1UL << EXTI_SWIER_SWIER17_Pos) /*!< 0x00020000 */ +#define EXTI_SWIER_SWIER17 EXTI_SWIER_SWIER17_Msk /*!< Software Interrupt on line 17 */ +#define EXTI_SWIER_SWIER18_Pos (18U) +#define EXTI_SWIER_SWIER18_Msk (0x1UL << EXTI_SWIER_SWIER18_Pos) /*!< 0x00040000 */ +#define EXTI_SWIER_SWIER18 EXTI_SWIER_SWIER18_Msk /*!< Software Interrupt on line 18 */ + +/* References Defines */ +#define EXTI_SWIER_SWI0 EXTI_SWIER_SWIER0 +#define EXTI_SWIER_SWI1 EXTI_SWIER_SWIER1 +#define EXTI_SWIER_SWI2 EXTI_SWIER_SWIER2 +#define EXTI_SWIER_SWI3 EXTI_SWIER_SWIER3 +#define EXTI_SWIER_SWI4 EXTI_SWIER_SWIER4 +#define EXTI_SWIER_SWI5 EXTI_SWIER_SWIER5 +#define EXTI_SWIER_SWI6 EXTI_SWIER_SWIER6 +#define EXTI_SWIER_SWI7 EXTI_SWIER_SWIER7 +#define EXTI_SWIER_SWI8 EXTI_SWIER_SWIER8 +#define EXTI_SWIER_SWI9 EXTI_SWIER_SWIER9 +#define EXTI_SWIER_SWI10 EXTI_SWIER_SWIER10 +#define EXTI_SWIER_SWI11 EXTI_SWIER_SWIER11 +#define EXTI_SWIER_SWI12 EXTI_SWIER_SWIER12 +#define EXTI_SWIER_SWI13 EXTI_SWIER_SWIER13 +#define EXTI_SWIER_SWI14 EXTI_SWIER_SWIER14 +#define EXTI_SWIER_SWI15 EXTI_SWIER_SWIER15 +#define EXTI_SWIER_SWI16 EXTI_SWIER_SWIER16 +#define EXTI_SWIER_SWI17 EXTI_SWIER_SWIER17 +#define EXTI_SWIER_SWI18 EXTI_SWIER_SWIER18 + +/******************* Bit definition for EXTI_PR register ********************/ +#define EXTI_PR_PR0_Pos (0U) +#define EXTI_PR_PR0_Msk (0x1UL << EXTI_PR_PR0_Pos) /*!< 0x00000001 */ +#define EXTI_PR_PR0 EXTI_PR_PR0_Msk /*!< Pending bit for line 0 */ +#define EXTI_PR_PR1_Pos (1U) +#define EXTI_PR_PR1_Msk (0x1UL << EXTI_PR_PR1_Pos) /*!< 0x00000002 */ +#define EXTI_PR_PR1 EXTI_PR_PR1_Msk /*!< Pending bit for line 1 */ +#define EXTI_PR_PR2_Pos (2U) +#define EXTI_PR_PR2_Msk (0x1UL << EXTI_PR_PR2_Pos) /*!< 0x00000004 */ +#define EXTI_PR_PR2 EXTI_PR_PR2_Msk /*!< Pending bit for line 2 */ +#define EXTI_PR_PR3_Pos (3U) +#define EXTI_PR_PR3_Msk (0x1UL << EXTI_PR_PR3_Pos) /*!< 0x00000008 */ +#define EXTI_PR_PR3 EXTI_PR_PR3_Msk /*!< Pending bit for line 3 */ +#define EXTI_PR_PR4_Pos (4U) +#define EXTI_PR_PR4_Msk (0x1UL << EXTI_PR_PR4_Pos) /*!< 0x00000010 */ +#define EXTI_PR_PR4 EXTI_PR_PR4_Msk /*!< Pending bit for line 4 */ +#define EXTI_PR_PR5_Pos (5U) +#define EXTI_PR_PR5_Msk (0x1UL << EXTI_PR_PR5_Pos) /*!< 0x00000020 */ +#define EXTI_PR_PR5 EXTI_PR_PR5_Msk /*!< Pending bit for line 5 */ +#define EXTI_PR_PR6_Pos (6U) +#define EXTI_PR_PR6_Msk (0x1UL << EXTI_PR_PR6_Pos) /*!< 0x00000040 */ +#define EXTI_PR_PR6 EXTI_PR_PR6_Msk /*!< Pending bit for line 6 */ +#define EXTI_PR_PR7_Pos (7U) +#define EXTI_PR_PR7_Msk (0x1UL << EXTI_PR_PR7_Pos) /*!< 0x00000080 */ +#define EXTI_PR_PR7 EXTI_PR_PR7_Msk /*!< Pending bit for line 7 */ +#define EXTI_PR_PR8_Pos (8U) +#define EXTI_PR_PR8_Msk (0x1UL << EXTI_PR_PR8_Pos) /*!< 0x00000100 */ +#define EXTI_PR_PR8 EXTI_PR_PR8_Msk /*!< Pending bit for line 8 */ +#define EXTI_PR_PR9_Pos (9U) +#define EXTI_PR_PR9_Msk (0x1UL << EXTI_PR_PR9_Pos) /*!< 0x00000200 */ +#define EXTI_PR_PR9 EXTI_PR_PR9_Msk /*!< Pending bit for line 9 */ +#define EXTI_PR_PR10_Pos (10U) +#define EXTI_PR_PR10_Msk (0x1UL << EXTI_PR_PR10_Pos) /*!< 0x00000400 */ +#define EXTI_PR_PR10 EXTI_PR_PR10_Msk /*!< Pending bit for line 10 */ +#define EXTI_PR_PR11_Pos (11U) +#define EXTI_PR_PR11_Msk (0x1UL << EXTI_PR_PR11_Pos) /*!< 0x00000800 */ +#define EXTI_PR_PR11 EXTI_PR_PR11_Msk /*!< Pending bit for line 11 */ +#define EXTI_PR_PR12_Pos (12U) +#define EXTI_PR_PR12_Msk (0x1UL << EXTI_PR_PR12_Pos) /*!< 0x00001000 */ +#define EXTI_PR_PR12 EXTI_PR_PR12_Msk /*!< Pending bit for line 12 */ +#define EXTI_PR_PR13_Pos (13U) +#define EXTI_PR_PR13_Msk (0x1UL << EXTI_PR_PR13_Pos) /*!< 0x00002000 */ +#define EXTI_PR_PR13 EXTI_PR_PR13_Msk /*!< Pending bit for line 13 */ +#define EXTI_PR_PR14_Pos (14U) +#define EXTI_PR_PR14_Msk (0x1UL << EXTI_PR_PR14_Pos) /*!< 0x00004000 */ +#define EXTI_PR_PR14 EXTI_PR_PR14_Msk /*!< Pending bit for line 14 */ +#define EXTI_PR_PR15_Pos (15U) +#define EXTI_PR_PR15_Msk (0x1UL << EXTI_PR_PR15_Pos) /*!< 0x00008000 */ +#define EXTI_PR_PR15 EXTI_PR_PR15_Msk /*!< Pending bit for line 15 */ +#define EXTI_PR_PR16_Pos (16U) +#define EXTI_PR_PR16_Msk (0x1UL << EXTI_PR_PR16_Pos) /*!< 0x00010000 */ +#define EXTI_PR_PR16 EXTI_PR_PR16_Msk /*!< Pending bit for line 16 */ +#define EXTI_PR_PR17_Pos (17U) +#define EXTI_PR_PR17_Msk (0x1UL << EXTI_PR_PR17_Pos) /*!< 0x00020000 */ +#define EXTI_PR_PR17 EXTI_PR_PR17_Msk /*!< Pending bit for line 17 */ +#define EXTI_PR_PR18_Pos (18U) +#define EXTI_PR_PR18_Msk (0x1UL << EXTI_PR_PR18_Pos) /*!< 0x00040000 */ +#define EXTI_PR_PR18 EXTI_PR_PR18_Msk /*!< Pending bit for line 18 */ + +/* References Defines */ +#define EXTI_PR_PIF0 EXTI_PR_PR0 +#define EXTI_PR_PIF1 EXTI_PR_PR1 +#define EXTI_PR_PIF2 EXTI_PR_PR2 +#define EXTI_PR_PIF3 EXTI_PR_PR3 +#define EXTI_PR_PIF4 EXTI_PR_PR4 +#define EXTI_PR_PIF5 EXTI_PR_PR5 +#define EXTI_PR_PIF6 EXTI_PR_PR6 +#define EXTI_PR_PIF7 EXTI_PR_PR7 +#define EXTI_PR_PIF8 EXTI_PR_PR8 +#define EXTI_PR_PIF9 EXTI_PR_PR9 +#define EXTI_PR_PIF10 EXTI_PR_PR10 +#define EXTI_PR_PIF11 EXTI_PR_PR11 +#define EXTI_PR_PIF12 EXTI_PR_PR12 +#define EXTI_PR_PIF13 EXTI_PR_PR13 +#define EXTI_PR_PIF14 EXTI_PR_PR14 +#define EXTI_PR_PIF15 EXTI_PR_PR15 +#define EXTI_PR_PIF16 EXTI_PR_PR16 +#define EXTI_PR_PIF17 EXTI_PR_PR17 +#define EXTI_PR_PIF18 EXTI_PR_PR18 + +/******************************************************************************/ +/* */ +/* DMA Controller */ +/* */ +/******************************************************************************/ + +/******************* Bit definition for DMA_ISR register ********************/ +#define DMA_ISR_GIF1_Pos (0U) +#define DMA_ISR_GIF1_Msk (0x1UL << DMA_ISR_GIF1_Pos) /*!< 0x00000001 */ +#define DMA_ISR_GIF1 DMA_ISR_GIF1_Msk /*!< Channel 1 Global interrupt flag */ +#define DMA_ISR_TCIF1_Pos (1U) +#define DMA_ISR_TCIF1_Msk (0x1UL << DMA_ISR_TCIF1_Pos) /*!< 0x00000002 */ +#define DMA_ISR_TCIF1 DMA_ISR_TCIF1_Msk /*!< Channel 1 Transfer Complete flag */ +#define DMA_ISR_HTIF1_Pos (2U) +#define DMA_ISR_HTIF1_Msk (0x1UL << DMA_ISR_HTIF1_Pos) /*!< 0x00000004 */ +#define DMA_ISR_HTIF1 DMA_ISR_HTIF1_Msk /*!< Channel 1 Half Transfer flag */ +#define DMA_ISR_TEIF1_Pos (3U) +#define DMA_ISR_TEIF1_Msk (0x1UL << DMA_ISR_TEIF1_Pos) /*!< 0x00000008 */ +#define DMA_ISR_TEIF1 DMA_ISR_TEIF1_Msk /*!< Channel 1 Transfer Error flag */ +#define DMA_ISR_GIF2_Pos (4U) +#define DMA_ISR_GIF2_Msk (0x1UL << DMA_ISR_GIF2_Pos) /*!< 0x00000010 */ +#define DMA_ISR_GIF2 DMA_ISR_GIF2_Msk /*!< Channel 2 Global interrupt flag */ +#define DMA_ISR_TCIF2_Pos (5U) +#define DMA_ISR_TCIF2_Msk (0x1UL << DMA_ISR_TCIF2_Pos) /*!< 0x00000020 */ +#define DMA_ISR_TCIF2 DMA_ISR_TCIF2_Msk /*!< Channel 2 Transfer Complete flag */ +#define DMA_ISR_HTIF2_Pos (6U) +#define DMA_ISR_HTIF2_Msk (0x1UL << DMA_ISR_HTIF2_Pos) /*!< 0x00000040 */ +#define DMA_ISR_HTIF2 DMA_ISR_HTIF2_Msk /*!< Channel 2 Half Transfer flag */ +#define DMA_ISR_TEIF2_Pos (7U) +#define DMA_ISR_TEIF2_Msk (0x1UL << DMA_ISR_TEIF2_Pos) /*!< 0x00000080 */ +#define DMA_ISR_TEIF2 DMA_ISR_TEIF2_Msk /*!< Channel 2 Transfer Error flag */ +#define DMA_ISR_GIF3_Pos (8U) +#define DMA_ISR_GIF3_Msk (0x1UL << DMA_ISR_GIF3_Pos) /*!< 0x00000100 */ +#define DMA_ISR_GIF3 DMA_ISR_GIF3_Msk /*!< Channel 3 Global interrupt flag */ +#define DMA_ISR_TCIF3_Pos (9U) +#define DMA_ISR_TCIF3_Msk (0x1UL << DMA_ISR_TCIF3_Pos) /*!< 0x00000200 */ +#define DMA_ISR_TCIF3 DMA_ISR_TCIF3_Msk /*!< Channel 3 Transfer Complete flag */ +#define DMA_ISR_HTIF3_Pos (10U) +#define DMA_ISR_HTIF3_Msk (0x1UL << DMA_ISR_HTIF3_Pos) /*!< 0x00000400 */ +#define DMA_ISR_HTIF3 DMA_ISR_HTIF3_Msk /*!< Channel 3 Half Transfer flag */ +#define DMA_ISR_TEIF3_Pos (11U) +#define DMA_ISR_TEIF3_Msk (0x1UL << DMA_ISR_TEIF3_Pos) /*!< 0x00000800 */ +#define DMA_ISR_TEIF3 DMA_ISR_TEIF3_Msk /*!< Channel 3 Transfer Error flag */ +#define DMA_ISR_GIF4_Pos (12U) +#define DMA_ISR_GIF4_Msk (0x1UL << DMA_ISR_GIF4_Pos) /*!< 0x00001000 */ +#define DMA_ISR_GIF4 DMA_ISR_GIF4_Msk /*!< Channel 4 Global interrupt flag */ +#define DMA_ISR_TCIF4_Pos (13U) +#define DMA_ISR_TCIF4_Msk (0x1UL << DMA_ISR_TCIF4_Pos) /*!< 0x00002000 */ +#define DMA_ISR_TCIF4 DMA_ISR_TCIF4_Msk /*!< Channel 4 Transfer Complete flag */ +#define DMA_ISR_HTIF4_Pos (14U) +#define DMA_ISR_HTIF4_Msk (0x1UL << DMA_ISR_HTIF4_Pos) /*!< 0x00004000 */ +#define DMA_ISR_HTIF4 DMA_ISR_HTIF4_Msk /*!< Channel 4 Half Transfer flag */ +#define DMA_ISR_TEIF4_Pos (15U) +#define DMA_ISR_TEIF4_Msk (0x1UL << DMA_ISR_TEIF4_Pos) /*!< 0x00008000 */ +#define DMA_ISR_TEIF4 DMA_ISR_TEIF4_Msk /*!< Channel 4 Transfer Error flag */ +#define DMA_ISR_GIF5_Pos (16U) +#define DMA_ISR_GIF5_Msk (0x1UL << DMA_ISR_GIF5_Pos) /*!< 0x00010000 */ +#define DMA_ISR_GIF5 DMA_ISR_GIF5_Msk /*!< Channel 5 Global interrupt flag */ +#define DMA_ISR_TCIF5_Pos (17U) +#define DMA_ISR_TCIF5_Msk (0x1UL << DMA_ISR_TCIF5_Pos) /*!< 0x00020000 */ +#define DMA_ISR_TCIF5 DMA_ISR_TCIF5_Msk /*!< Channel 5 Transfer Complete flag */ +#define DMA_ISR_HTIF5_Pos (18U) +#define DMA_ISR_HTIF5_Msk (0x1UL << DMA_ISR_HTIF5_Pos) /*!< 0x00040000 */ +#define DMA_ISR_HTIF5 DMA_ISR_HTIF5_Msk /*!< Channel 5 Half Transfer flag */ +#define DMA_ISR_TEIF5_Pos (19U) +#define DMA_ISR_TEIF5_Msk (0x1UL << DMA_ISR_TEIF5_Pos) /*!< 0x00080000 */ +#define DMA_ISR_TEIF5 DMA_ISR_TEIF5_Msk /*!< Channel 5 Transfer Error flag */ +#define DMA_ISR_GIF6_Pos (20U) +#define DMA_ISR_GIF6_Msk (0x1UL << DMA_ISR_GIF6_Pos) /*!< 0x00100000 */ +#define DMA_ISR_GIF6 DMA_ISR_GIF6_Msk /*!< Channel 6 Global interrupt flag */ +#define DMA_ISR_TCIF6_Pos (21U) +#define DMA_ISR_TCIF6_Msk (0x1UL << DMA_ISR_TCIF6_Pos) /*!< 0x00200000 */ +#define DMA_ISR_TCIF6 DMA_ISR_TCIF6_Msk /*!< Channel 6 Transfer Complete flag */ +#define DMA_ISR_HTIF6_Pos (22U) +#define DMA_ISR_HTIF6_Msk (0x1UL << DMA_ISR_HTIF6_Pos) /*!< 0x00400000 */ +#define DMA_ISR_HTIF6 DMA_ISR_HTIF6_Msk /*!< Channel 6 Half Transfer flag */ +#define DMA_ISR_TEIF6_Pos (23U) +#define DMA_ISR_TEIF6_Msk (0x1UL << DMA_ISR_TEIF6_Pos) /*!< 0x00800000 */ +#define DMA_ISR_TEIF6 DMA_ISR_TEIF6_Msk /*!< Channel 6 Transfer Error flag */ +#define DMA_ISR_GIF7_Pos (24U) +#define DMA_ISR_GIF7_Msk (0x1UL << DMA_ISR_GIF7_Pos) /*!< 0x01000000 */ +#define DMA_ISR_GIF7 DMA_ISR_GIF7_Msk /*!< Channel 7 Global interrupt flag */ +#define DMA_ISR_TCIF7_Pos (25U) +#define DMA_ISR_TCIF7_Msk (0x1UL << DMA_ISR_TCIF7_Pos) /*!< 0x02000000 */ +#define DMA_ISR_TCIF7 DMA_ISR_TCIF7_Msk /*!< Channel 7 Transfer Complete flag */ +#define DMA_ISR_HTIF7_Pos (26U) +#define DMA_ISR_HTIF7_Msk (0x1UL << DMA_ISR_HTIF7_Pos) /*!< 0x04000000 */ +#define DMA_ISR_HTIF7 DMA_ISR_HTIF7_Msk /*!< Channel 7 Half Transfer flag */ +#define DMA_ISR_TEIF7_Pos (27U) +#define DMA_ISR_TEIF7_Msk (0x1UL << DMA_ISR_TEIF7_Pos) /*!< 0x08000000 */ +#define DMA_ISR_TEIF7 DMA_ISR_TEIF7_Msk /*!< Channel 7 Transfer Error flag */ + +/******************* Bit definition for DMA_IFCR register *******************/ +#define DMA_IFCR_CGIF1_Pos (0U) +#define DMA_IFCR_CGIF1_Msk (0x1UL << DMA_IFCR_CGIF1_Pos) /*!< 0x00000001 */ +#define DMA_IFCR_CGIF1 DMA_IFCR_CGIF1_Msk /*!< Channel 1 Global interrupt clear */ +#define DMA_IFCR_CTCIF1_Pos (1U) +#define DMA_IFCR_CTCIF1_Msk (0x1UL << DMA_IFCR_CTCIF1_Pos) /*!< 0x00000002 */ +#define DMA_IFCR_CTCIF1 DMA_IFCR_CTCIF1_Msk /*!< Channel 1 Transfer Complete clear */ +#define DMA_IFCR_CHTIF1_Pos (2U) +#define DMA_IFCR_CHTIF1_Msk (0x1UL << DMA_IFCR_CHTIF1_Pos) /*!< 0x00000004 */ +#define DMA_IFCR_CHTIF1 DMA_IFCR_CHTIF1_Msk /*!< Channel 1 Half Transfer clear */ +#define DMA_IFCR_CTEIF1_Pos (3U) +#define DMA_IFCR_CTEIF1_Msk (0x1UL << DMA_IFCR_CTEIF1_Pos) /*!< 0x00000008 */ +#define DMA_IFCR_CTEIF1 DMA_IFCR_CTEIF1_Msk /*!< Channel 1 Transfer Error clear */ +#define DMA_IFCR_CGIF2_Pos (4U) +#define DMA_IFCR_CGIF2_Msk (0x1UL << DMA_IFCR_CGIF2_Pos) /*!< 0x00000010 */ +#define DMA_IFCR_CGIF2 DMA_IFCR_CGIF2_Msk /*!< Channel 2 Global interrupt clear */ +#define DMA_IFCR_CTCIF2_Pos (5U) +#define DMA_IFCR_CTCIF2_Msk (0x1UL << DMA_IFCR_CTCIF2_Pos) /*!< 0x00000020 */ +#define DMA_IFCR_CTCIF2 DMA_IFCR_CTCIF2_Msk /*!< Channel 2 Transfer Complete clear */ +#define DMA_IFCR_CHTIF2_Pos (6U) +#define DMA_IFCR_CHTIF2_Msk (0x1UL << DMA_IFCR_CHTIF2_Pos) /*!< 0x00000040 */ +#define DMA_IFCR_CHTIF2 DMA_IFCR_CHTIF2_Msk /*!< Channel 2 Half Transfer clear */ +#define DMA_IFCR_CTEIF2_Pos (7U) +#define DMA_IFCR_CTEIF2_Msk (0x1UL << DMA_IFCR_CTEIF2_Pos) /*!< 0x00000080 */ +#define DMA_IFCR_CTEIF2 DMA_IFCR_CTEIF2_Msk /*!< Channel 2 Transfer Error clear */ +#define DMA_IFCR_CGIF3_Pos (8U) +#define DMA_IFCR_CGIF3_Msk (0x1UL << DMA_IFCR_CGIF3_Pos) /*!< 0x00000100 */ +#define DMA_IFCR_CGIF3 DMA_IFCR_CGIF3_Msk /*!< Channel 3 Global interrupt clear */ +#define DMA_IFCR_CTCIF3_Pos (9U) +#define DMA_IFCR_CTCIF3_Msk (0x1UL << DMA_IFCR_CTCIF3_Pos) /*!< 0x00000200 */ +#define DMA_IFCR_CTCIF3 DMA_IFCR_CTCIF3_Msk /*!< Channel 3 Transfer Complete clear */ +#define DMA_IFCR_CHTIF3_Pos (10U) +#define DMA_IFCR_CHTIF3_Msk (0x1UL << DMA_IFCR_CHTIF3_Pos) /*!< 0x00000400 */ +#define DMA_IFCR_CHTIF3 DMA_IFCR_CHTIF3_Msk /*!< Channel 3 Half Transfer clear */ +#define DMA_IFCR_CTEIF3_Pos (11U) +#define DMA_IFCR_CTEIF3_Msk (0x1UL << DMA_IFCR_CTEIF3_Pos) /*!< 0x00000800 */ +#define DMA_IFCR_CTEIF3 DMA_IFCR_CTEIF3_Msk /*!< Channel 3 Transfer Error clear */ +#define DMA_IFCR_CGIF4_Pos (12U) +#define DMA_IFCR_CGIF4_Msk (0x1UL << DMA_IFCR_CGIF4_Pos) /*!< 0x00001000 */ +#define DMA_IFCR_CGIF4 DMA_IFCR_CGIF4_Msk /*!< Channel 4 Global interrupt clear */ +#define DMA_IFCR_CTCIF4_Pos (13U) +#define DMA_IFCR_CTCIF4_Msk (0x1UL << DMA_IFCR_CTCIF4_Pos) /*!< 0x00002000 */ +#define DMA_IFCR_CTCIF4 DMA_IFCR_CTCIF4_Msk /*!< Channel 4 Transfer Complete clear */ +#define DMA_IFCR_CHTIF4_Pos (14U) +#define DMA_IFCR_CHTIF4_Msk (0x1UL << DMA_IFCR_CHTIF4_Pos) /*!< 0x00004000 */ +#define DMA_IFCR_CHTIF4 DMA_IFCR_CHTIF4_Msk /*!< Channel 4 Half Transfer clear */ +#define DMA_IFCR_CTEIF4_Pos (15U) +#define DMA_IFCR_CTEIF4_Msk (0x1UL << DMA_IFCR_CTEIF4_Pos) /*!< 0x00008000 */ +#define DMA_IFCR_CTEIF4 DMA_IFCR_CTEIF4_Msk /*!< Channel 4 Transfer Error clear */ +#define DMA_IFCR_CGIF5_Pos (16U) +#define DMA_IFCR_CGIF5_Msk (0x1UL << DMA_IFCR_CGIF5_Pos) /*!< 0x00010000 */ +#define DMA_IFCR_CGIF5 DMA_IFCR_CGIF5_Msk /*!< Channel 5 Global interrupt clear */ +#define DMA_IFCR_CTCIF5_Pos (17U) +#define DMA_IFCR_CTCIF5_Msk (0x1UL << DMA_IFCR_CTCIF5_Pos) /*!< 0x00020000 */ +#define DMA_IFCR_CTCIF5 DMA_IFCR_CTCIF5_Msk /*!< Channel 5 Transfer Complete clear */ +#define DMA_IFCR_CHTIF5_Pos (18U) +#define DMA_IFCR_CHTIF5_Msk (0x1UL << DMA_IFCR_CHTIF5_Pos) /*!< 0x00040000 */ +#define DMA_IFCR_CHTIF5 DMA_IFCR_CHTIF5_Msk /*!< Channel 5 Half Transfer clear */ +#define DMA_IFCR_CTEIF5_Pos (19U) +#define DMA_IFCR_CTEIF5_Msk (0x1UL << DMA_IFCR_CTEIF5_Pos) /*!< 0x00080000 */ +#define DMA_IFCR_CTEIF5 DMA_IFCR_CTEIF5_Msk /*!< Channel 5 Transfer Error clear */ +#define DMA_IFCR_CGIF6_Pos (20U) +#define DMA_IFCR_CGIF6_Msk (0x1UL << DMA_IFCR_CGIF6_Pos) /*!< 0x00100000 */ +#define DMA_IFCR_CGIF6 DMA_IFCR_CGIF6_Msk /*!< Channel 6 Global interrupt clear */ +#define DMA_IFCR_CTCIF6_Pos (21U) +#define DMA_IFCR_CTCIF6_Msk (0x1UL << DMA_IFCR_CTCIF6_Pos) /*!< 0x00200000 */ +#define DMA_IFCR_CTCIF6 DMA_IFCR_CTCIF6_Msk /*!< Channel 6 Transfer Complete clear */ +#define DMA_IFCR_CHTIF6_Pos (22U) +#define DMA_IFCR_CHTIF6_Msk (0x1UL << DMA_IFCR_CHTIF6_Pos) /*!< 0x00400000 */ +#define DMA_IFCR_CHTIF6 DMA_IFCR_CHTIF6_Msk /*!< Channel 6 Half Transfer clear */ +#define DMA_IFCR_CTEIF6_Pos (23U) +#define DMA_IFCR_CTEIF6_Msk (0x1UL << DMA_IFCR_CTEIF6_Pos) /*!< 0x00800000 */ +#define DMA_IFCR_CTEIF6 DMA_IFCR_CTEIF6_Msk /*!< Channel 6 Transfer Error clear */ +#define DMA_IFCR_CGIF7_Pos (24U) +#define DMA_IFCR_CGIF7_Msk (0x1UL << DMA_IFCR_CGIF7_Pos) /*!< 0x01000000 */ +#define DMA_IFCR_CGIF7 DMA_IFCR_CGIF7_Msk /*!< Channel 7 Global interrupt clear */ +#define DMA_IFCR_CTCIF7_Pos (25U) +#define DMA_IFCR_CTCIF7_Msk (0x1UL << DMA_IFCR_CTCIF7_Pos) /*!< 0x02000000 */ +#define DMA_IFCR_CTCIF7 DMA_IFCR_CTCIF7_Msk /*!< Channel 7 Transfer Complete clear */ +#define DMA_IFCR_CHTIF7_Pos (26U) +#define DMA_IFCR_CHTIF7_Msk (0x1UL << DMA_IFCR_CHTIF7_Pos) /*!< 0x04000000 */ +#define DMA_IFCR_CHTIF7 DMA_IFCR_CHTIF7_Msk /*!< Channel 7 Half Transfer clear */ +#define DMA_IFCR_CTEIF7_Pos (27U) +#define DMA_IFCR_CTEIF7_Msk (0x1UL << DMA_IFCR_CTEIF7_Pos) /*!< 0x08000000 */ +#define DMA_IFCR_CTEIF7 DMA_IFCR_CTEIF7_Msk /*!< Channel 7 Transfer Error clear */ + +/******************* Bit definition for DMA_CCR register *******************/ +#define DMA_CCR_EN_Pos (0U) +#define DMA_CCR_EN_Msk (0x1UL << DMA_CCR_EN_Pos) /*!< 0x00000001 */ +#define DMA_CCR_EN DMA_CCR_EN_Msk /*!< Channel enable */ +#define DMA_CCR_TCIE_Pos (1U) +#define DMA_CCR_TCIE_Msk (0x1UL << DMA_CCR_TCIE_Pos) /*!< 0x00000002 */ +#define DMA_CCR_TCIE DMA_CCR_TCIE_Msk /*!< Transfer complete interrupt enable */ +#define DMA_CCR_HTIE_Pos (2U) +#define DMA_CCR_HTIE_Msk (0x1UL << DMA_CCR_HTIE_Pos) /*!< 0x00000004 */ +#define DMA_CCR_HTIE DMA_CCR_HTIE_Msk /*!< Half Transfer interrupt enable */ +#define DMA_CCR_TEIE_Pos (3U) +#define DMA_CCR_TEIE_Msk (0x1UL << DMA_CCR_TEIE_Pos) /*!< 0x00000008 */ +#define DMA_CCR_TEIE DMA_CCR_TEIE_Msk /*!< Transfer error interrupt enable */ +#define DMA_CCR_DIR_Pos (4U) +#define DMA_CCR_DIR_Msk (0x1UL << DMA_CCR_DIR_Pos) /*!< 0x00000010 */ +#define DMA_CCR_DIR DMA_CCR_DIR_Msk /*!< Data transfer direction */ +#define DMA_CCR_CIRC_Pos (5U) +#define DMA_CCR_CIRC_Msk (0x1UL << DMA_CCR_CIRC_Pos) /*!< 0x00000020 */ +#define DMA_CCR_CIRC DMA_CCR_CIRC_Msk /*!< Circular mode */ +#define DMA_CCR_PINC_Pos (6U) +#define DMA_CCR_PINC_Msk (0x1UL << DMA_CCR_PINC_Pos) /*!< 0x00000040 */ +#define DMA_CCR_PINC DMA_CCR_PINC_Msk /*!< Peripheral increment mode */ +#define DMA_CCR_MINC_Pos (7U) +#define DMA_CCR_MINC_Msk (0x1UL << DMA_CCR_MINC_Pos) /*!< 0x00000080 */ +#define DMA_CCR_MINC DMA_CCR_MINC_Msk /*!< Memory increment mode */ + +#define DMA_CCR_PSIZE_Pos (8U) +#define DMA_CCR_PSIZE_Msk (0x3UL << DMA_CCR_PSIZE_Pos) /*!< 0x00000300 */ +#define DMA_CCR_PSIZE DMA_CCR_PSIZE_Msk /*!< PSIZE[1:0] bits (Peripheral size) */ +#define DMA_CCR_PSIZE_0 (0x1UL << DMA_CCR_PSIZE_Pos) /*!< 0x00000100 */ +#define DMA_CCR_PSIZE_1 (0x2UL << DMA_CCR_PSIZE_Pos) /*!< 0x00000200 */ + +#define DMA_CCR_MSIZE_Pos (10U) +#define DMA_CCR_MSIZE_Msk (0x3UL << DMA_CCR_MSIZE_Pos) /*!< 0x00000C00 */ +#define DMA_CCR_MSIZE DMA_CCR_MSIZE_Msk /*!< MSIZE[1:0] bits (Memory size) */ +#define DMA_CCR_MSIZE_0 (0x1UL << DMA_CCR_MSIZE_Pos) /*!< 0x00000400 */ +#define DMA_CCR_MSIZE_1 (0x2UL << DMA_CCR_MSIZE_Pos) /*!< 0x00000800 */ + +#define DMA_CCR_PL_Pos (12U) +#define DMA_CCR_PL_Msk (0x3UL << DMA_CCR_PL_Pos) /*!< 0x00003000 */ +#define DMA_CCR_PL DMA_CCR_PL_Msk /*!< PL[1:0] bits(Channel Priority level) */ +#define DMA_CCR_PL_0 (0x1UL << DMA_CCR_PL_Pos) /*!< 0x00001000 */ +#define DMA_CCR_PL_1 (0x2UL << DMA_CCR_PL_Pos) /*!< 0x00002000 */ + +#define DMA_CCR_MEM2MEM_Pos (14U) +#define DMA_CCR_MEM2MEM_Msk (0x1UL << DMA_CCR_MEM2MEM_Pos) /*!< 0x00004000 */ +#define DMA_CCR_MEM2MEM DMA_CCR_MEM2MEM_Msk /*!< Memory to memory mode */ + +/****************** Bit definition for DMA_CNDTR register ******************/ +#define DMA_CNDTR_NDT_Pos (0U) +#define DMA_CNDTR_NDT_Msk (0xFFFFUL << DMA_CNDTR_NDT_Pos) /*!< 0x0000FFFF */ +#define DMA_CNDTR_NDT DMA_CNDTR_NDT_Msk /*!< Number of data to Transfer */ + +/****************** Bit definition for DMA_CPAR register *******************/ +#define DMA_CPAR_PA_Pos (0U) +#define DMA_CPAR_PA_Msk (0xFFFFFFFFUL << DMA_CPAR_PA_Pos) /*!< 0xFFFFFFFF */ +#define DMA_CPAR_PA DMA_CPAR_PA_Msk /*!< Peripheral Address */ + +/****************** Bit definition for DMA_CMAR register *******************/ +#define DMA_CMAR_MA_Pos (0U) +#define DMA_CMAR_MA_Msk (0xFFFFFFFFUL << DMA_CMAR_MA_Pos) /*!< 0xFFFFFFFF */ +#define DMA_CMAR_MA DMA_CMAR_MA_Msk /*!< Memory Address */ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter (ADC) */ +/* */ +/******************************************************************************/ + +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F1 family) + */ +#define ADC_MULTIMODE_SUPPORT /*!< ADC feature available only on specific devices: multimode available on devices with several ADC instances */ + +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD_Pos (0U) +#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ +#define ADC_SR_AWD ADC_SR_AWD_Msk /*!< ADC analog watchdog 1 flag */ +#define ADC_SR_EOS_Pos (1U) +#define ADC_SR_EOS_Msk (0x1UL << ADC_SR_EOS_Pos) /*!< 0x00000002 */ +#define ADC_SR_EOS ADC_SR_EOS_Msk /*!< ADC group regular end of sequence conversions flag */ +#define ADC_SR_JEOS_Pos (2U) +#define ADC_SR_JEOS_Msk (0x1UL << ADC_SR_JEOS_Pos) /*!< 0x00000004 */ +#define ADC_SR_JEOS ADC_SR_JEOS_Msk /*!< ADC group injected end of sequence conversions flag */ +#define ADC_SR_JSTRT_Pos (3U) +#define ADC_SR_JSTRT_Msk (0x1UL << ADC_SR_JSTRT_Pos) /*!< 0x00000008 */ +#define ADC_SR_JSTRT ADC_SR_JSTRT_Msk /*!< ADC group injected conversion start flag */ +#define ADC_SR_STRT_Pos (4U) +#define ADC_SR_STRT_Msk (0x1UL << ADC_SR_STRT_Pos) /*!< 0x00000010 */ +#define ADC_SR_STRT ADC_SR_STRT_Msk /*!< ADC group regular conversion start flag */ + +/* Legacy defines */ +#define ADC_SR_EOC (ADC_SR_EOS) +#define ADC_SR_JEOC (ADC_SR_JEOS) + +/******************* Bit definition for ADC_CR1 register ********************/ +#define ADC_CR1_AWDCH_Pos (0U) +#define ADC_CR1_AWDCH_Msk (0x1FUL << ADC_CR1_AWDCH_Pos) /*!< 0x0000001F */ +#define ADC_CR1_AWDCH ADC_CR1_AWDCH_Msk /*!< ADC analog watchdog 1 monitored channel selection */ +#define ADC_CR1_AWDCH_0 (0x01UL << ADC_CR1_AWDCH_Pos) /*!< 0x00000001 */ +#define ADC_CR1_AWDCH_1 (0x02UL << ADC_CR1_AWDCH_Pos) /*!< 0x00000002 */ +#define ADC_CR1_AWDCH_2 (0x04UL << ADC_CR1_AWDCH_Pos) /*!< 0x00000004 */ +#define ADC_CR1_AWDCH_3 (0x08UL << ADC_CR1_AWDCH_Pos) /*!< 0x00000008 */ +#define ADC_CR1_AWDCH_4 (0x10UL << ADC_CR1_AWDCH_Pos) /*!< 0x00000010 */ + +#define ADC_CR1_EOSIE_Pos (5U) +#define ADC_CR1_EOSIE_Msk (0x1UL << ADC_CR1_EOSIE_Pos) /*!< 0x00000020 */ +#define ADC_CR1_EOSIE ADC_CR1_EOSIE_Msk /*!< ADC group regular end of sequence conversions interrupt */ +#define ADC_CR1_AWDIE_Pos (6U) +#define ADC_CR1_AWDIE_Msk (0x1UL << ADC_CR1_AWDIE_Pos) /*!< 0x00000040 */ +#define ADC_CR1_AWDIE ADC_CR1_AWDIE_Msk /*!< ADC analog watchdog 1 interrupt */ +#define ADC_CR1_JEOSIE_Pos (7U) +#define ADC_CR1_JEOSIE_Msk (0x1UL << ADC_CR1_JEOSIE_Pos) /*!< 0x00000080 */ +#define ADC_CR1_JEOSIE ADC_CR1_JEOSIE_Msk /*!< ADC group injected end of sequence conversions interrupt */ +#define ADC_CR1_SCAN_Pos (8U) +#define ADC_CR1_SCAN_Msk (0x1UL << ADC_CR1_SCAN_Pos) /*!< 0x00000100 */ +#define ADC_CR1_SCAN ADC_CR1_SCAN_Msk /*!< ADC scan mode */ +#define ADC_CR1_AWDSGL_Pos (9U) +#define ADC_CR1_AWDSGL_Msk (0x1UL << ADC_CR1_AWDSGL_Pos) /*!< 0x00000200 */ +#define ADC_CR1_AWDSGL ADC_CR1_AWDSGL_Msk /*!< ADC analog watchdog 1 monitoring a single channel or all channels */ +#define ADC_CR1_JAUTO_Pos (10U) +#define ADC_CR1_JAUTO_Msk (0x1UL << ADC_CR1_JAUTO_Pos) /*!< 0x00000400 */ +#define ADC_CR1_JAUTO ADC_CR1_JAUTO_Msk /*!< ADC group injected automatic trigger mode */ +#define ADC_CR1_DISCEN_Pos (11U) +#define ADC_CR1_DISCEN_Msk (0x1UL << ADC_CR1_DISCEN_Pos) /*!< 0x00000800 */ +#define ADC_CR1_DISCEN ADC_CR1_DISCEN_Msk /*!< ADC group regular sequencer discontinuous mode */ +#define ADC_CR1_JDISCEN_Pos (12U) +#define ADC_CR1_JDISCEN_Msk (0x1UL << ADC_CR1_JDISCEN_Pos) /*!< 0x00001000 */ +#define ADC_CR1_JDISCEN ADC_CR1_JDISCEN_Msk /*!< ADC group injected sequencer discontinuous mode */ + +#define ADC_CR1_DISCNUM_Pos (13U) +#define ADC_CR1_DISCNUM_Msk (0x7UL << ADC_CR1_DISCNUM_Pos) /*!< 0x0000E000 */ +#define ADC_CR1_DISCNUM ADC_CR1_DISCNUM_Msk /*!< ADC group regular sequencer discontinuous number of ranks */ +#define ADC_CR1_DISCNUM_0 (0x1UL << ADC_CR1_DISCNUM_Pos) /*!< 0x00002000 */ +#define ADC_CR1_DISCNUM_1 (0x2UL << ADC_CR1_DISCNUM_Pos) /*!< 0x00004000 */ +#define ADC_CR1_DISCNUM_2 (0x4UL << ADC_CR1_DISCNUM_Pos) /*!< 0x00008000 */ + +#define ADC_CR1_DUALMOD_Pos (16U) +#define ADC_CR1_DUALMOD_Msk (0xFUL << ADC_CR1_DUALMOD_Pos) /*!< 0x000F0000 */ +#define ADC_CR1_DUALMOD ADC_CR1_DUALMOD_Msk /*!< ADC multimode mode selection */ +#define ADC_CR1_DUALMOD_0 (0x1UL << ADC_CR1_DUALMOD_Pos) /*!< 0x00010000 */ +#define ADC_CR1_DUALMOD_1 (0x2UL << ADC_CR1_DUALMOD_Pos) /*!< 0x00020000 */ +#define ADC_CR1_DUALMOD_2 (0x4UL << ADC_CR1_DUALMOD_Pos) /*!< 0x00040000 */ +#define ADC_CR1_DUALMOD_3 (0x8UL << ADC_CR1_DUALMOD_Pos) /*!< 0x00080000 */ + +#define ADC_CR1_JAWDEN_Pos (22U) +#define ADC_CR1_JAWDEN_Msk (0x1UL << ADC_CR1_JAWDEN_Pos) /*!< 0x00400000 */ +#define ADC_CR1_JAWDEN ADC_CR1_JAWDEN_Msk /*!< ADC analog watchdog 1 enable on scope ADC group injected */ +#define ADC_CR1_AWDEN_Pos (23U) +#define ADC_CR1_AWDEN_Msk (0x1UL << ADC_CR1_AWDEN_Pos) /*!< 0x00800000 */ +#define ADC_CR1_AWDEN ADC_CR1_AWDEN_Msk /*!< ADC analog watchdog 1 enable on scope ADC group regular */ + +/* Legacy defines */ +#define ADC_CR1_EOCIE (ADC_CR1_EOSIE) +#define ADC_CR1_JEOCIE (ADC_CR1_JEOSIE) + +/******************* Bit definition for ADC_CR2 register ********************/ +#define ADC_CR2_ADON_Pos (0U) +#define ADC_CR2_ADON_Msk (0x1UL << ADC_CR2_ADON_Pos) /*!< 0x00000001 */ +#define ADC_CR2_ADON ADC_CR2_ADON_Msk /*!< ADC enable */ +#define ADC_CR2_CONT_Pos (1U) +#define ADC_CR2_CONT_Msk (0x1UL << ADC_CR2_CONT_Pos) /*!< 0x00000002 */ +#define ADC_CR2_CONT ADC_CR2_CONT_Msk /*!< ADC group regular continuous conversion mode */ +#define ADC_CR2_CAL_Pos (2U) +#define ADC_CR2_CAL_Msk (0x1UL << ADC_CR2_CAL_Pos) /*!< 0x00000004 */ +#define ADC_CR2_CAL ADC_CR2_CAL_Msk /*!< ADC calibration start */ +#define ADC_CR2_RSTCAL_Pos (3U) +#define ADC_CR2_RSTCAL_Msk (0x1UL << ADC_CR2_RSTCAL_Pos) /*!< 0x00000008 */ +#define ADC_CR2_RSTCAL ADC_CR2_RSTCAL_Msk /*!< ADC calibration reset */ +#define ADC_CR2_DMA_Pos (8U) +#define ADC_CR2_DMA_Msk (0x1UL << ADC_CR2_DMA_Pos) /*!< 0x00000100 */ +#define ADC_CR2_DMA ADC_CR2_DMA_Msk /*!< ADC DMA transfer enable */ +#define ADC_CR2_ALIGN_Pos (11U) +#define ADC_CR2_ALIGN_Msk (0x1UL << ADC_CR2_ALIGN_Pos) /*!< 0x00000800 */ +#define ADC_CR2_ALIGN ADC_CR2_ALIGN_Msk /*!< ADC data alignment */ + +#define ADC_CR2_JEXTSEL_Pos (12U) +#define ADC_CR2_JEXTSEL_Msk (0x7UL << ADC_CR2_JEXTSEL_Pos) /*!< 0x00007000 */ +#define ADC_CR2_JEXTSEL ADC_CR2_JEXTSEL_Msk /*!< ADC group injected external trigger source */ +#define ADC_CR2_JEXTSEL_0 (0x1UL << ADC_CR2_JEXTSEL_Pos) /*!< 0x00001000 */ +#define ADC_CR2_JEXTSEL_1 (0x2UL << ADC_CR2_JEXTSEL_Pos) /*!< 0x00002000 */ +#define ADC_CR2_JEXTSEL_2 (0x4UL << ADC_CR2_JEXTSEL_Pos) /*!< 0x00004000 */ + +#define ADC_CR2_JEXTTRIG_Pos (15U) +#define ADC_CR2_JEXTTRIG_Msk (0x1UL << ADC_CR2_JEXTTRIG_Pos) /*!< 0x00008000 */ +#define ADC_CR2_JEXTTRIG ADC_CR2_JEXTTRIG_Msk /*!< ADC group injected external trigger enable */ + +#define ADC_CR2_EXTSEL_Pos (17U) +#define ADC_CR2_EXTSEL_Msk (0x7UL << ADC_CR2_EXTSEL_Pos) /*!< 0x000E0000 */ +#define ADC_CR2_EXTSEL ADC_CR2_EXTSEL_Msk /*!< ADC group regular external trigger source */ +#define ADC_CR2_EXTSEL_0 (0x1UL << ADC_CR2_EXTSEL_Pos) /*!< 0x00020000 */ +#define ADC_CR2_EXTSEL_1 (0x2UL << ADC_CR2_EXTSEL_Pos) /*!< 0x00040000 */ +#define ADC_CR2_EXTSEL_2 (0x4UL << ADC_CR2_EXTSEL_Pos) /*!< 0x00080000 */ + +#define ADC_CR2_EXTTRIG_Pos (20U) +#define ADC_CR2_EXTTRIG_Msk (0x1UL << ADC_CR2_EXTTRIG_Pos) /*!< 0x00100000 */ +#define ADC_CR2_EXTTRIG ADC_CR2_EXTTRIG_Msk /*!< ADC group regular external trigger enable */ +#define ADC_CR2_JSWSTART_Pos (21U) +#define ADC_CR2_JSWSTART_Msk (0x1UL << ADC_CR2_JSWSTART_Pos) /*!< 0x00200000 */ +#define ADC_CR2_JSWSTART ADC_CR2_JSWSTART_Msk /*!< ADC group injected conversion start */ +#define ADC_CR2_SWSTART_Pos (22U) +#define ADC_CR2_SWSTART_Msk (0x1UL << ADC_CR2_SWSTART_Pos) /*!< 0x00400000 */ +#define ADC_CR2_SWSTART ADC_CR2_SWSTART_Msk /*!< ADC group regular conversion start */ +#define ADC_CR2_TSVREFE_Pos (23U) +#define ADC_CR2_TSVREFE_Msk (0x1UL << ADC_CR2_TSVREFE_Pos) /*!< 0x00800000 */ +#define ADC_CR2_TSVREFE ADC_CR2_TSVREFE_Msk /*!< ADC internal path to VrefInt and temperature sensor enable */ + +/****************** Bit definition for ADC_SMPR1 register *******************/ +#define ADC_SMPR1_SMP10_Pos (0U) +#define ADC_SMPR1_SMP10_Msk (0x7UL << ADC_SMPR1_SMP10_Pos) /*!< 0x00000007 */ +#define ADC_SMPR1_SMP10 ADC_SMPR1_SMP10_Msk /*!< ADC channel 10 sampling time selection */ +#define ADC_SMPR1_SMP10_0 (0x1UL << ADC_SMPR1_SMP10_Pos) /*!< 0x00000001 */ +#define ADC_SMPR1_SMP10_1 (0x2UL << ADC_SMPR1_SMP10_Pos) /*!< 0x00000002 */ +#define ADC_SMPR1_SMP10_2 (0x4UL << ADC_SMPR1_SMP10_Pos) /*!< 0x00000004 */ + +#define ADC_SMPR1_SMP11_Pos (3U) +#define ADC_SMPR1_SMP11_Msk (0x7UL << ADC_SMPR1_SMP11_Pos) /*!< 0x00000038 */ +#define ADC_SMPR1_SMP11 ADC_SMPR1_SMP11_Msk /*!< ADC channel 11 sampling time selection */ +#define ADC_SMPR1_SMP11_0 (0x1UL << ADC_SMPR1_SMP11_Pos) /*!< 0x00000008 */ +#define ADC_SMPR1_SMP11_1 (0x2UL << ADC_SMPR1_SMP11_Pos) /*!< 0x00000010 */ +#define ADC_SMPR1_SMP11_2 (0x4UL << ADC_SMPR1_SMP11_Pos) /*!< 0x00000020 */ + +#define ADC_SMPR1_SMP12_Pos (6U) +#define ADC_SMPR1_SMP12_Msk (0x7UL << ADC_SMPR1_SMP12_Pos) /*!< 0x000001C0 */ +#define ADC_SMPR1_SMP12 ADC_SMPR1_SMP12_Msk /*!< ADC channel 12 sampling time selection */ +#define ADC_SMPR1_SMP12_0 (0x1UL << ADC_SMPR1_SMP12_Pos) /*!< 0x00000040 */ +#define ADC_SMPR1_SMP12_1 (0x2UL << ADC_SMPR1_SMP12_Pos) /*!< 0x00000080 */ +#define ADC_SMPR1_SMP12_2 (0x4UL << ADC_SMPR1_SMP12_Pos) /*!< 0x00000100 */ + +#define ADC_SMPR1_SMP13_Pos (9U) +#define ADC_SMPR1_SMP13_Msk (0x7UL << ADC_SMPR1_SMP13_Pos) /*!< 0x00000E00 */ +#define ADC_SMPR1_SMP13 ADC_SMPR1_SMP13_Msk /*!< ADC channel 13 sampling time selection */ +#define ADC_SMPR1_SMP13_0 (0x1UL << ADC_SMPR1_SMP13_Pos) /*!< 0x00000200 */ +#define ADC_SMPR1_SMP13_1 (0x2UL << ADC_SMPR1_SMP13_Pos) /*!< 0x00000400 */ +#define ADC_SMPR1_SMP13_2 (0x4UL << ADC_SMPR1_SMP13_Pos) /*!< 0x00000800 */ + +#define ADC_SMPR1_SMP14_Pos (12U) +#define ADC_SMPR1_SMP14_Msk (0x7UL << ADC_SMPR1_SMP14_Pos) /*!< 0x00007000 */ +#define ADC_SMPR1_SMP14 ADC_SMPR1_SMP14_Msk /*!< ADC channel 14 sampling time selection */ +#define ADC_SMPR1_SMP14_0 (0x1UL << ADC_SMPR1_SMP14_Pos) /*!< 0x00001000 */ +#define ADC_SMPR1_SMP14_1 (0x2UL << ADC_SMPR1_SMP14_Pos) /*!< 0x00002000 */ +#define ADC_SMPR1_SMP14_2 (0x4UL << ADC_SMPR1_SMP14_Pos) /*!< 0x00004000 */ + +#define ADC_SMPR1_SMP15_Pos (15U) +#define ADC_SMPR1_SMP15_Msk (0x7UL << ADC_SMPR1_SMP15_Pos) /*!< 0x00038000 */ +#define ADC_SMPR1_SMP15 ADC_SMPR1_SMP15_Msk /*!< ADC channel 15 sampling time selection */ +#define ADC_SMPR1_SMP15_0 (0x1UL << ADC_SMPR1_SMP15_Pos) /*!< 0x00008000 */ +#define ADC_SMPR1_SMP15_1 (0x2UL << ADC_SMPR1_SMP15_Pos) /*!< 0x00010000 */ +#define ADC_SMPR1_SMP15_2 (0x4UL << ADC_SMPR1_SMP15_Pos) /*!< 0x00020000 */ + +#define ADC_SMPR1_SMP16_Pos (18U) +#define ADC_SMPR1_SMP16_Msk (0x7UL << ADC_SMPR1_SMP16_Pos) /*!< 0x001C0000 */ +#define ADC_SMPR1_SMP16 ADC_SMPR1_SMP16_Msk /*!< ADC channel 16 sampling time selection */ +#define ADC_SMPR1_SMP16_0 (0x1UL << ADC_SMPR1_SMP16_Pos) /*!< 0x00040000 */ +#define ADC_SMPR1_SMP16_1 (0x2UL << ADC_SMPR1_SMP16_Pos) /*!< 0x00080000 */ +#define ADC_SMPR1_SMP16_2 (0x4UL << ADC_SMPR1_SMP16_Pos) /*!< 0x00100000 */ + +#define ADC_SMPR1_SMP17_Pos (21U) +#define ADC_SMPR1_SMP17_Msk (0x7UL << ADC_SMPR1_SMP17_Pos) /*!< 0x00E00000 */ +#define ADC_SMPR1_SMP17 ADC_SMPR1_SMP17_Msk /*!< ADC channel 17 sampling time selection */ +#define ADC_SMPR1_SMP17_0 (0x1UL << ADC_SMPR1_SMP17_Pos) /*!< 0x00200000 */ +#define ADC_SMPR1_SMP17_1 (0x2UL << ADC_SMPR1_SMP17_Pos) /*!< 0x00400000 */ +#define ADC_SMPR1_SMP17_2 (0x4UL << ADC_SMPR1_SMP17_Pos) /*!< 0x00800000 */ + +/****************** Bit definition for ADC_SMPR2 register *******************/ +#define ADC_SMPR2_SMP0_Pos (0U) +#define ADC_SMPR2_SMP0_Msk (0x7UL << ADC_SMPR2_SMP0_Pos) /*!< 0x00000007 */ +#define ADC_SMPR2_SMP0 ADC_SMPR2_SMP0_Msk /*!< ADC channel 0 sampling time selection */ +#define ADC_SMPR2_SMP0_0 (0x1UL << ADC_SMPR2_SMP0_Pos) /*!< 0x00000001 */ +#define ADC_SMPR2_SMP0_1 (0x2UL << ADC_SMPR2_SMP0_Pos) /*!< 0x00000002 */ +#define ADC_SMPR2_SMP0_2 (0x4UL << ADC_SMPR2_SMP0_Pos) /*!< 0x00000004 */ + +#define ADC_SMPR2_SMP1_Pos (3U) +#define ADC_SMPR2_SMP1_Msk (0x7UL << ADC_SMPR2_SMP1_Pos) /*!< 0x00000038 */ +#define ADC_SMPR2_SMP1 ADC_SMPR2_SMP1_Msk /*!< ADC channel 1 sampling time selection */ +#define ADC_SMPR2_SMP1_0 (0x1UL << ADC_SMPR2_SMP1_Pos) /*!< 0x00000008 */ +#define ADC_SMPR2_SMP1_1 (0x2UL << ADC_SMPR2_SMP1_Pos) /*!< 0x00000010 */ +#define ADC_SMPR2_SMP1_2 (0x4UL << ADC_SMPR2_SMP1_Pos) /*!< 0x00000020 */ + +#define ADC_SMPR2_SMP2_Pos (6U) +#define ADC_SMPR2_SMP2_Msk (0x7UL << ADC_SMPR2_SMP2_Pos) /*!< 0x000001C0 */ +#define ADC_SMPR2_SMP2 ADC_SMPR2_SMP2_Msk /*!< ADC channel 2 sampling time selection */ +#define ADC_SMPR2_SMP2_0 (0x1UL << ADC_SMPR2_SMP2_Pos) /*!< 0x00000040 */ +#define ADC_SMPR2_SMP2_1 (0x2UL << ADC_SMPR2_SMP2_Pos) /*!< 0x00000080 */ +#define ADC_SMPR2_SMP2_2 (0x4UL << ADC_SMPR2_SMP2_Pos) /*!< 0x00000100 */ + +#define ADC_SMPR2_SMP3_Pos (9U) +#define ADC_SMPR2_SMP3_Msk (0x7UL << ADC_SMPR2_SMP3_Pos) /*!< 0x00000E00 */ +#define ADC_SMPR2_SMP3 ADC_SMPR2_SMP3_Msk /*!< ADC channel 3 sampling time selection */ +#define ADC_SMPR2_SMP3_0 (0x1UL << ADC_SMPR2_SMP3_Pos) /*!< 0x00000200 */ +#define ADC_SMPR2_SMP3_1 (0x2UL << ADC_SMPR2_SMP3_Pos) /*!< 0x00000400 */ +#define ADC_SMPR2_SMP3_2 (0x4UL << ADC_SMPR2_SMP3_Pos) /*!< 0x00000800 */ + +#define ADC_SMPR2_SMP4_Pos (12U) +#define ADC_SMPR2_SMP4_Msk (0x7UL << ADC_SMPR2_SMP4_Pos) /*!< 0x00007000 */ +#define ADC_SMPR2_SMP4 ADC_SMPR2_SMP4_Msk /*!< ADC channel 4 sampling time selection */ +#define ADC_SMPR2_SMP4_0 (0x1UL << ADC_SMPR2_SMP4_Pos) /*!< 0x00001000 */ +#define ADC_SMPR2_SMP4_1 (0x2UL << ADC_SMPR2_SMP4_Pos) /*!< 0x00002000 */ +#define ADC_SMPR2_SMP4_2 (0x4UL << ADC_SMPR2_SMP4_Pos) /*!< 0x00004000 */ + +#define ADC_SMPR2_SMP5_Pos (15U) +#define ADC_SMPR2_SMP5_Msk (0x7UL << ADC_SMPR2_SMP5_Pos) /*!< 0x00038000 */ +#define ADC_SMPR2_SMP5 ADC_SMPR2_SMP5_Msk /*!< ADC channel 5 sampling time selection */ +#define ADC_SMPR2_SMP5_0 (0x1UL << ADC_SMPR2_SMP5_Pos) /*!< 0x00008000 */ +#define ADC_SMPR2_SMP5_1 (0x2UL << ADC_SMPR2_SMP5_Pos) /*!< 0x00010000 */ +#define ADC_SMPR2_SMP5_2 (0x4UL << ADC_SMPR2_SMP5_Pos) /*!< 0x00020000 */ + +#define ADC_SMPR2_SMP6_Pos (18U) +#define ADC_SMPR2_SMP6_Msk (0x7UL << ADC_SMPR2_SMP6_Pos) /*!< 0x001C0000 */ +#define ADC_SMPR2_SMP6 ADC_SMPR2_SMP6_Msk /*!< ADC channel 6 sampling time selection */ +#define ADC_SMPR2_SMP6_0 (0x1UL << ADC_SMPR2_SMP6_Pos) /*!< 0x00040000 */ +#define ADC_SMPR2_SMP6_1 (0x2UL << ADC_SMPR2_SMP6_Pos) /*!< 0x00080000 */ +#define ADC_SMPR2_SMP6_2 (0x4UL << ADC_SMPR2_SMP6_Pos) /*!< 0x00100000 */ + +#define ADC_SMPR2_SMP7_Pos (21U) +#define ADC_SMPR2_SMP7_Msk (0x7UL << ADC_SMPR2_SMP7_Pos) /*!< 0x00E00000 */ +#define ADC_SMPR2_SMP7 ADC_SMPR2_SMP7_Msk /*!< ADC channel 7 sampling time selection */ +#define ADC_SMPR2_SMP7_0 (0x1UL << ADC_SMPR2_SMP7_Pos) /*!< 0x00200000 */ +#define ADC_SMPR2_SMP7_1 (0x2UL << ADC_SMPR2_SMP7_Pos) /*!< 0x00400000 */ +#define ADC_SMPR2_SMP7_2 (0x4UL << ADC_SMPR2_SMP7_Pos) /*!< 0x00800000 */ + +#define ADC_SMPR2_SMP8_Pos (24U) +#define ADC_SMPR2_SMP8_Msk (0x7UL << ADC_SMPR2_SMP8_Pos) /*!< 0x07000000 */ +#define ADC_SMPR2_SMP8 ADC_SMPR2_SMP8_Msk /*!< ADC channel 8 sampling time selection */ +#define ADC_SMPR2_SMP8_0 (0x1UL << ADC_SMPR2_SMP8_Pos) /*!< 0x01000000 */ +#define ADC_SMPR2_SMP8_1 (0x2UL << ADC_SMPR2_SMP8_Pos) /*!< 0x02000000 */ +#define ADC_SMPR2_SMP8_2 (0x4UL << ADC_SMPR2_SMP8_Pos) /*!< 0x04000000 */ + +#define ADC_SMPR2_SMP9_Pos (27U) +#define ADC_SMPR2_SMP9_Msk (0x7UL << ADC_SMPR2_SMP9_Pos) /*!< 0x38000000 */ +#define ADC_SMPR2_SMP9 ADC_SMPR2_SMP9_Msk /*!< ADC channel 9 sampling time selection */ +#define ADC_SMPR2_SMP9_0 (0x1UL << ADC_SMPR2_SMP9_Pos) /*!< 0x08000000 */ +#define ADC_SMPR2_SMP9_1 (0x2UL << ADC_SMPR2_SMP9_Pos) /*!< 0x10000000 */ +#define ADC_SMPR2_SMP9_2 (0x4UL << ADC_SMPR2_SMP9_Pos) /*!< 0x20000000 */ + +/****************** Bit definition for ADC_JOFR1 register *******************/ +#define ADC_JOFR1_JOFFSET1_Pos (0U) +#define ADC_JOFR1_JOFFSET1_Msk (0xFFFUL << ADC_JOFR1_JOFFSET1_Pos) /*!< 0x00000FFF */ +#define ADC_JOFR1_JOFFSET1 ADC_JOFR1_JOFFSET1_Msk /*!< ADC group injected sequencer rank 1 offset value */ + +/****************** Bit definition for ADC_JOFR2 register *******************/ +#define ADC_JOFR2_JOFFSET2_Pos (0U) +#define ADC_JOFR2_JOFFSET2_Msk (0xFFFUL << ADC_JOFR2_JOFFSET2_Pos) /*!< 0x00000FFF */ +#define ADC_JOFR2_JOFFSET2 ADC_JOFR2_JOFFSET2_Msk /*!< ADC group injected sequencer rank 2 offset value */ + +/****************** Bit definition for ADC_JOFR3 register *******************/ +#define ADC_JOFR3_JOFFSET3_Pos (0U) +#define ADC_JOFR3_JOFFSET3_Msk (0xFFFUL << ADC_JOFR3_JOFFSET3_Pos) /*!< 0x00000FFF */ +#define ADC_JOFR3_JOFFSET3 ADC_JOFR3_JOFFSET3_Msk /*!< ADC group injected sequencer rank 3 offset value */ + +/****************** Bit definition for ADC_JOFR4 register *******************/ +#define ADC_JOFR4_JOFFSET4_Pos (0U) +#define ADC_JOFR4_JOFFSET4_Msk (0xFFFUL << ADC_JOFR4_JOFFSET4_Pos) /*!< 0x00000FFF */ +#define ADC_JOFR4_JOFFSET4 ADC_JOFR4_JOFFSET4_Msk /*!< ADC group injected sequencer rank 4 offset value */ + +/******************* Bit definition for ADC_HTR register ********************/ +#define ADC_HTR_HT_Pos (0U) +#define ADC_HTR_HT_Msk (0xFFFUL << ADC_HTR_HT_Pos) /*!< 0x00000FFF */ +#define ADC_HTR_HT ADC_HTR_HT_Msk /*!< ADC analog watchdog 1 threshold high */ + +/******************* Bit definition for ADC_LTR register ********************/ +#define ADC_LTR_LT_Pos (0U) +#define ADC_LTR_LT_Msk (0xFFFUL << ADC_LTR_LT_Pos) /*!< 0x00000FFF */ +#define ADC_LTR_LT ADC_LTR_LT_Msk /*!< ADC analog watchdog 1 threshold low */ + +/******************* Bit definition for ADC_SQR1 register *******************/ +#define ADC_SQR1_SQ13_Pos (0U) +#define ADC_SQR1_SQ13_Msk (0x1FUL << ADC_SQR1_SQ13_Pos) /*!< 0x0000001F */ +#define ADC_SQR1_SQ13 ADC_SQR1_SQ13_Msk /*!< ADC group regular sequencer rank 13 */ +#define ADC_SQR1_SQ13_0 (0x01UL << ADC_SQR1_SQ13_Pos) /*!< 0x00000001 */ +#define ADC_SQR1_SQ13_1 (0x02UL << ADC_SQR1_SQ13_Pos) /*!< 0x00000002 */ +#define ADC_SQR1_SQ13_2 (0x04UL << ADC_SQR1_SQ13_Pos) /*!< 0x00000004 */ +#define ADC_SQR1_SQ13_3 (0x08UL << ADC_SQR1_SQ13_Pos) /*!< 0x00000008 */ +#define ADC_SQR1_SQ13_4 (0x10UL << ADC_SQR1_SQ13_Pos) /*!< 0x00000010 */ + +#define ADC_SQR1_SQ14_Pos (5U) +#define ADC_SQR1_SQ14_Msk (0x1FUL << ADC_SQR1_SQ14_Pos) /*!< 0x000003E0 */ +#define ADC_SQR1_SQ14 ADC_SQR1_SQ14_Msk /*!< ADC group regular sequencer rank 14 */ +#define ADC_SQR1_SQ14_0 (0x01UL << ADC_SQR1_SQ14_Pos) /*!< 0x00000020 */ +#define ADC_SQR1_SQ14_1 (0x02UL << ADC_SQR1_SQ14_Pos) /*!< 0x00000040 */ +#define ADC_SQR1_SQ14_2 (0x04UL << ADC_SQR1_SQ14_Pos) /*!< 0x00000080 */ +#define ADC_SQR1_SQ14_3 (0x08UL << ADC_SQR1_SQ14_Pos) /*!< 0x00000100 */ +#define ADC_SQR1_SQ14_4 (0x10UL << ADC_SQR1_SQ14_Pos) /*!< 0x00000200 */ + +#define ADC_SQR1_SQ15_Pos (10U) +#define ADC_SQR1_SQ15_Msk (0x1FUL << ADC_SQR1_SQ15_Pos) /*!< 0x00007C00 */ +#define ADC_SQR1_SQ15 ADC_SQR1_SQ15_Msk /*!< ADC group regular sequencer rank 15 */ +#define ADC_SQR1_SQ15_0 (0x01UL << ADC_SQR1_SQ15_Pos) /*!< 0x00000400 */ +#define ADC_SQR1_SQ15_1 (0x02UL << ADC_SQR1_SQ15_Pos) /*!< 0x00000800 */ +#define ADC_SQR1_SQ15_2 (0x04UL << ADC_SQR1_SQ15_Pos) /*!< 0x00001000 */ +#define ADC_SQR1_SQ15_3 (0x08UL << ADC_SQR1_SQ15_Pos) /*!< 0x00002000 */ +#define ADC_SQR1_SQ15_4 (0x10UL << ADC_SQR1_SQ15_Pos) /*!< 0x00004000 */ + +#define ADC_SQR1_SQ16_Pos (15U) +#define ADC_SQR1_SQ16_Msk (0x1FUL << ADC_SQR1_SQ16_Pos) /*!< 0x000F8000 */ +#define ADC_SQR1_SQ16 ADC_SQR1_SQ16_Msk /*!< ADC group regular sequencer rank 16 */ +#define ADC_SQR1_SQ16_0 (0x01UL << ADC_SQR1_SQ16_Pos) /*!< 0x00008000 */ +#define ADC_SQR1_SQ16_1 (0x02UL << ADC_SQR1_SQ16_Pos) /*!< 0x00010000 */ +#define ADC_SQR1_SQ16_2 (0x04UL << ADC_SQR1_SQ16_Pos) /*!< 0x00020000 */ +#define ADC_SQR1_SQ16_3 (0x08UL << ADC_SQR1_SQ16_Pos) /*!< 0x00040000 */ +#define ADC_SQR1_SQ16_4 (0x10UL << ADC_SQR1_SQ16_Pos) /*!< 0x00080000 */ + +#define ADC_SQR1_L_Pos (20U) +#define ADC_SQR1_L_Msk (0xFUL << ADC_SQR1_L_Pos) /*!< 0x00F00000 */ +#define ADC_SQR1_L ADC_SQR1_L_Msk /*!< ADC group regular sequencer scan length */ +#define ADC_SQR1_L_0 (0x1UL << ADC_SQR1_L_Pos) /*!< 0x00100000 */ +#define ADC_SQR1_L_1 (0x2UL << ADC_SQR1_L_Pos) /*!< 0x00200000 */ +#define ADC_SQR1_L_2 (0x4UL << ADC_SQR1_L_Pos) /*!< 0x00400000 */ +#define ADC_SQR1_L_3 (0x8UL << ADC_SQR1_L_Pos) /*!< 0x00800000 */ + +/******************* Bit definition for ADC_SQR2 register *******************/ +#define ADC_SQR2_SQ7_Pos (0U) +#define ADC_SQR2_SQ7_Msk (0x1FUL << ADC_SQR2_SQ7_Pos) /*!< 0x0000001F */ +#define ADC_SQR2_SQ7 ADC_SQR2_SQ7_Msk /*!< ADC group regular sequencer rank 7 */ +#define ADC_SQR2_SQ7_0 (0x01UL << ADC_SQR2_SQ7_Pos) /*!< 0x00000001 */ +#define ADC_SQR2_SQ7_1 (0x02UL << ADC_SQR2_SQ7_Pos) /*!< 0x00000002 */ +#define ADC_SQR2_SQ7_2 (0x04UL << ADC_SQR2_SQ7_Pos) /*!< 0x00000004 */ +#define ADC_SQR2_SQ7_3 (0x08UL << ADC_SQR2_SQ7_Pos) /*!< 0x00000008 */ +#define ADC_SQR2_SQ7_4 (0x10UL << ADC_SQR2_SQ7_Pos) /*!< 0x00000010 */ + +#define ADC_SQR2_SQ8_Pos (5U) +#define ADC_SQR2_SQ8_Msk (0x1FUL << ADC_SQR2_SQ8_Pos) /*!< 0x000003E0 */ +#define ADC_SQR2_SQ8 ADC_SQR2_SQ8_Msk /*!< ADC group regular sequencer rank 8 */ +#define ADC_SQR2_SQ8_0 (0x01UL << ADC_SQR2_SQ8_Pos) /*!< 0x00000020 */ +#define ADC_SQR2_SQ8_1 (0x02UL << ADC_SQR2_SQ8_Pos) /*!< 0x00000040 */ +#define ADC_SQR2_SQ8_2 (0x04UL << ADC_SQR2_SQ8_Pos) /*!< 0x00000080 */ +#define ADC_SQR2_SQ8_3 (0x08UL << ADC_SQR2_SQ8_Pos) /*!< 0x00000100 */ +#define ADC_SQR2_SQ8_4 (0x10UL << ADC_SQR2_SQ8_Pos) /*!< 0x00000200 */ + +#define ADC_SQR2_SQ9_Pos (10U) +#define ADC_SQR2_SQ9_Msk (0x1FUL << ADC_SQR2_SQ9_Pos) /*!< 0x00007C00 */ +#define ADC_SQR2_SQ9 ADC_SQR2_SQ9_Msk /*!< ADC group regular sequencer rank 9 */ +#define ADC_SQR2_SQ9_0 (0x01UL << ADC_SQR2_SQ9_Pos) /*!< 0x00000400 */ +#define ADC_SQR2_SQ9_1 (0x02UL << ADC_SQR2_SQ9_Pos) /*!< 0x00000800 */ +#define ADC_SQR2_SQ9_2 (0x04UL << ADC_SQR2_SQ9_Pos) /*!< 0x00001000 */ +#define ADC_SQR2_SQ9_3 (0x08UL << ADC_SQR2_SQ9_Pos) /*!< 0x00002000 */ +#define ADC_SQR2_SQ9_4 (0x10UL << ADC_SQR2_SQ9_Pos) /*!< 0x00004000 */ + +#define ADC_SQR2_SQ10_Pos (15U) +#define ADC_SQR2_SQ10_Msk (0x1FUL << ADC_SQR2_SQ10_Pos) /*!< 0x000F8000 */ +#define ADC_SQR2_SQ10 ADC_SQR2_SQ10_Msk /*!< ADC group regular sequencer rank 10 */ +#define ADC_SQR2_SQ10_0 (0x01UL << ADC_SQR2_SQ10_Pos) /*!< 0x00008000 */ +#define ADC_SQR2_SQ10_1 (0x02UL << ADC_SQR2_SQ10_Pos) /*!< 0x00010000 */ +#define ADC_SQR2_SQ10_2 (0x04UL << ADC_SQR2_SQ10_Pos) /*!< 0x00020000 */ +#define ADC_SQR2_SQ10_3 (0x08UL << ADC_SQR2_SQ10_Pos) /*!< 0x00040000 */ +#define ADC_SQR2_SQ10_4 (0x10UL << ADC_SQR2_SQ10_Pos) /*!< 0x00080000 */ + +#define ADC_SQR2_SQ11_Pos (20U) +#define ADC_SQR2_SQ11_Msk (0x1FUL << ADC_SQR2_SQ11_Pos) /*!< 0x01F00000 */ +#define ADC_SQR2_SQ11 ADC_SQR2_SQ11_Msk /*!< ADC group regular sequencer rank 1 */ +#define ADC_SQR2_SQ11_0 (0x01UL << ADC_SQR2_SQ11_Pos) /*!< 0x00100000 */ +#define ADC_SQR2_SQ11_1 (0x02UL << ADC_SQR2_SQ11_Pos) /*!< 0x00200000 */ +#define ADC_SQR2_SQ11_2 (0x04UL << ADC_SQR2_SQ11_Pos) /*!< 0x00400000 */ +#define ADC_SQR2_SQ11_3 (0x08UL << ADC_SQR2_SQ11_Pos) /*!< 0x00800000 */ +#define ADC_SQR2_SQ11_4 (0x10UL << ADC_SQR2_SQ11_Pos) /*!< 0x01000000 */ + +#define ADC_SQR2_SQ12_Pos (25U) +#define ADC_SQR2_SQ12_Msk (0x1FUL << ADC_SQR2_SQ12_Pos) /*!< 0x3E000000 */ +#define ADC_SQR2_SQ12 ADC_SQR2_SQ12_Msk /*!< ADC group regular sequencer rank 12 */ +#define ADC_SQR2_SQ12_0 (0x01UL << ADC_SQR2_SQ12_Pos) /*!< 0x02000000 */ +#define ADC_SQR2_SQ12_1 (0x02UL << ADC_SQR2_SQ12_Pos) /*!< 0x04000000 */ +#define ADC_SQR2_SQ12_2 (0x04UL << ADC_SQR2_SQ12_Pos) /*!< 0x08000000 */ +#define ADC_SQR2_SQ12_3 (0x08UL << ADC_SQR2_SQ12_Pos) /*!< 0x10000000 */ +#define ADC_SQR2_SQ12_4 (0x10UL << ADC_SQR2_SQ12_Pos) /*!< 0x20000000 */ + +/******************* Bit definition for ADC_SQR3 register *******************/ +#define ADC_SQR3_SQ1_Pos (0U) +#define ADC_SQR3_SQ1_Msk (0x1FUL << ADC_SQR3_SQ1_Pos) /*!< 0x0000001F */ +#define ADC_SQR3_SQ1 ADC_SQR3_SQ1_Msk /*!< ADC group regular sequencer rank 1 */ +#define ADC_SQR3_SQ1_0 (0x01UL << ADC_SQR3_SQ1_Pos) /*!< 0x00000001 */ +#define ADC_SQR3_SQ1_1 (0x02UL << ADC_SQR3_SQ1_Pos) /*!< 0x00000002 */ +#define ADC_SQR3_SQ1_2 (0x04UL << ADC_SQR3_SQ1_Pos) /*!< 0x00000004 */ +#define ADC_SQR3_SQ1_3 (0x08UL << ADC_SQR3_SQ1_Pos) /*!< 0x00000008 */ +#define ADC_SQR3_SQ1_4 (0x10UL << ADC_SQR3_SQ1_Pos) /*!< 0x00000010 */ + +#define ADC_SQR3_SQ2_Pos (5U) +#define ADC_SQR3_SQ2_Msk (0x1FUL << ADC_SQR3_SQ2_Pos) /*!< 0x000003E0 */ +#define ADC_SQR3_SQ2 ADC_SQR3_SQ2_Msk /*!< ADC group regular sequencer rank 2 */ +#define ADC_SQR3_SQ2_0 (0x01UL << ADC_SQR3_SQ2_Pos) /*!< 0x00000020 */ +#define ADC_SQR3_SQ2_1 (0x02UL << ADC_SQR3_SQ2_Pos) /*!< 0x00000040 */ +#define ADC_SQR3_SQ2_2 (0x04UL << ADC_SQR3_SQ2_Pos) /*!< 0x00000080 */ +#define ADC_SQR3_SQ2_3 (0x08UL << ADC_SQR3_SQ2_Pos) /*!< 0x00000100 */ +#define ADC_SQR3_SQ2_4 (0x10UL << ADC_SQR3_SQ2_Pos) /*!< 0x00000200 */ + +#define ADC_SQR3_SQ3_Pos (10U) +#define ADC_SQR3_SQ3_Msk (0x1FUL << ADC_SQR3_SQ3_Pos) /*!< 0x00007C00 */ +#define ADC_SQR3_SQ3 ADC_SQR3_SQ3_Msk /*!< ADC group regular sequencer rank 3 */ +#define ADC_SQR3_SQ3_0 (0x01UL << ADC_SQR3_SQ3_Pos) /*!< 0x00000400 */ +#define ADC_SQR3_SQ3_1 (0x02UL << ADC_SQR3_SQ3_Pos) /*!< 0x00000800 */ +#define ADC_SQR3_SQ3_2 (0x04UL << ADC_SQR3_SQ3_Pos) /*!< 0x00001000 */ +#define ADC_SQR3_SQ3_3 (0x08UL << ADC_SQR3_SQ3_Pos) /*!< 0x00002000 */ +#define ADC_SQR3_SQ3_4 (0x10UL << ADC_SQR3_SQ3_Pos) /*!< 0x00004000 */ + +#define ADC_SQR3_SQ4_Pos (15U) +#define ADC_SQR3_SQ4_Msk (0x1FUL << ADC_SQR3_SQ4_Pos) /*!< 0x000F8000 */ +#define ADC_SQR3_SQ4 ADC_SQR3_SQ4_Msk /*!< ADC group regular sequencer rank 4 */ +#define ADC_SQR3_SQ4_0 (0x01UL << ADC_SQR3_SQ4_Pos) /*!< 0x00008000 */ +#define ADC_SQR3_SQ4_1 (0x02UL << ADC_SQR3_SQ4_Pos) /*!< 0x00010000 */ +#define ADC_SQR3_SQ4_2 (0x04UL << ADC_SQR3_SQ4_Pos) /*!< 0x00020000 */ +#define ADC_SQR3_SQ4_3 (0x08UL << ADC_SQR3_SQ4_Pos) /*!< 0x00040000 */ +#define ADC_SQR3_SQ4_4 (0x10UL << ADC_SQR3_SQ4_Pos) /*!< 0x00080000 */ + +#define ADC_SQR3_SQ5_Pos (20U) +#define ADC_SQR3_SQ5_Msk (0x1FUL << ADC_SQR3_SQ5_Pos) /*!< 0x01F00000 */ +#define ADC_SQR3_SQ5 ADC_SQR3_SQ5_Msk /*!< ADC group regular sequencer rank 5 */ +#define ADC_SQR3_SQ5_0 (0x01UL << ADC_SQR3_SQ5_Pos) /*!< 0x00100000 */ +#define ADC_SQR3_SQ5_1 (0x02UL << ADC_SQR3_SQ5_Pos) /*!< 0x00200000 */ +#define ADC_SQR3_SQ5_2 (0x04UL << ADC_SQR3_SQ5_Pos) /*!< 0x00400000 */ +#define ADC_SQR3_SQ5_3 (0x08UL << ADC_SQR3_SQ5_Pos) /*!< 0x00800000 */ +#define ADC_SQR3_SQ5_4 (0x10UL << ADC_SQR3_SQ5_Pos) /*!< 0x01000000 */ + +#define ADC_SQR3_SQ6_Pos (25U) +#define ADC_SQR3_SQ6_Msk (0x1FUL << ADC_SQR3_SQ6_Pos) /*!< 0x3E000000 */ +#define ADC_SQR3_SQ6 ADC_SQR3_SQ6_Msk /*!< ADC group regular sequencer rank 6 */ +#define ADC_SQR3_SQ6_0 (0x01UL << ADC_SQR3_SQ6_Pos) /*!< 0x02000000 */ +#define ADC_SQR3_SQ6_1 (0x02UL << ADC_SQR3_SQ6_Pos) /*!< 0x04000000 */ +#define ADC_SQR3_SQ6_2 (0x04UL << ADC_SQR3_SQ6_Pos) /*!< 0x08000000 */ +#define ADC_SQR3_SQ6_3 (0x08UL << ADC_SQR3_SQ6_Pos) /*!< 0x10000000 */ +#define ADC_SQR3_SQ6_4 (0x10UL << ADC_SQR3_SQ6_Pos) /*!< 0x20000000 */ + +/******************* Bit definition for ADC_JSQR register *******************/ +#define ADC_JSQR_JSQ1_Pos (0U) +#define ADC_JSQR_JSQ1_Msk (0x1FUL << ADC_JSQR_JSQ1_Pos) /*!< 0x0000001F */ +#define ADC_JSQR_JSQ1 ADC_JSQR_JSQ1_Msk /*!< ADC group injected sequencer rank 1 */ +#define ADC_JSQR_JSQ1_0 (0x01UL << ADC_JSQR_JSQ1_Pos) /*!< 0x00000001 */ +#define ADC_JSQR_JSQ1_1 (0x02UL << ADC_JSQR_JSQ1_Pos) /*!< 0x00000002 */ +#define ADC_JSQR_JSQ1_2 (0x04UL << ADC_JSQR_JSQ1_Pos) /*!< 0x00000004 */ +#define ADC_JSQR_JSQ1_3 (0x08UL << ADC_JSQR_JSQ1_Pos) /*!< 0x00000008 */ +#define ADC_JSQR_JSQ1_4 (0x10UL << ADC_JSQR_JSQ1_Pos) /*!< 0x00000010 */ + +#define ADC_JSQR_JSQ2_Pos (5U) +#define ADC_JSQR_JSQ2_Msk (0x1FUL << ADC_JSQR_JSQ2_Pos) /*!< 0x000003E0 */ +#define ADC_JSQR_JSQ2 ADC_JSQR_JSQ2_Msk /*!< ADC group injected sequencer rank 2 */ +#define ADC_JSQR_JSQ2_0 (0x01UL << ADC_JSQR_JSQ2_Pos) /*!< 0x00000020 */ +#define ADC_JSQR_JSQ2_1 (0x02UL << ADC_JSQR_JSQ2_Pos) /*!< 0x00000040 */ +#define ADC_JSQR_JSQ2_2 (0x04UL << ADC_JSQR_JSQ2_Pos) /*!< 0x00000080 */ +#define ADC_JSQR_JSQ2_3 (0x08UL << ADC_JSQR_JSQ2_Pos) /*!< 0x00000100 */ +#define ADC_JSQR_JSQ2_4 (0x10UL << ADC_JSQR_JSQ2_Pos) /*!< 0x00000200 */ + +#define ADC_JSQR_JSQ3_Pos (10U) +#define ADC_JSQR_JSQ3_Msk (0x1FUL << ADC_JSQR_JSQ3_Pos) /*!< 0x00007C00 */ +#define ADC_JSQR_JSQ3 ADC_JSQR_JSQ3_Msk /*!< ADC group injected sequencer rank 3 */ +#define ADC_JSQR_JSQ3_0 (0x01UL << ADC_JSQR_JSQ3_Pos) /*!< 0x00000400 */ +#define ADC_JSQR_JSQ3_1 (0x02UL << ADC_JSQR_JSQ3_Pos) /*!< 0x00000800 */ +#define ADC_JSQR_JSQ3_2 (0x04UL << ADC_JSQR_JSQ3_Pos) /*!< 0x00001000 */ +#define ADC_JSQR_JSQ3_3 (0x08UL << ADC_JSQR_JSQ3_Pos) /*!< 0x00002000 */ +#define ADC_JSQR_JSQ3_4 (0x10UL << ADC_JSQR_JSQ3_Pos) /*!< 0x00004000 */ + +#define ADC_JSQR_JSQ4_Pos (15U) +#define ADC_JSQR_JSQ4_Msk (0x1FUL << ADC_JSQR_JSQ4_Pos) /*!< 0x000F8000 */ +#define ADC_JSQR_JSQ4 ADC_JSQR_JSQ4_Msk /*!< ADC group injected sequencer rank 4 */ +#define ADC_JSQR_JSQ4_0 (0x01UL << ADC_JSQR_JSQ4_Pos) /*!< 0x00008000 */ +#define ADC_JSQR_JSQ4_1 (0x02UL << ADC_JSQR_JSQ4_Pos) /*!< 0x00010000 */ +#define ADC_JSQR_JSQ4_2 (0x04UL << ADC_JSQR_JSQ4_Pos) /*!< 0x00020000 */ +#define ADC_JSQR_JSQ4_3 (0x08UL << ADC_JSQR_JSQ4_Pos) /*!< 0x00040000 */ +#define ADC_JSQR_JSQ4_4 (0x10UL << ADC_JSQR_JSQ4_Pos) /*!< 0x00080000 */ + +#define ADC_JSQR_JL_Pos (20U) +#define ADC_JSQR_JL_Msk (0x3UL << ADC_JSQR_JL_Pos) /*!< 0x00300000 */ +#define ADC_JSQR_JL ADC_JSQR_JL_Msk /*!< ADC group injected sequencer scan length */ +#define ADC_JSQR_JL_0 (0x1UL << ADC_JSQR_JL_Pos) /*!< 0x00100000 */ +#define ADC_JSQR_JL_1 (0x2UL << ADC_JSQR_JL_Pos) /*!< 0x00200000 */ + +/******************* Bit definition for ADC_JDR1 register *******************/ +#define ADC_JDR1_JDATA_Pos (0U) +#define ADC_JDR1_JDATA_Msk (0xFFFFUL << ADC_JDR1_JDATA_Pos) /*!< 0x0000FFFF */ +#define ADC_JDR1_JDATA ADC_JDR1_JDATA_Msk /*!< ADC group injected sequencer rank 1 conversion data */ + +/******************* Bit definition for ADC_JDR2 register *******************/ +#define ADC_JDR2_JDATA_Pos (0U) +#define ADC_JDR2_JDATA_Msk (0xFFFFUL << ADC_JDR2_JDATA_Pos) /*!< 0x0000FFFF */ +#define ADC_JDR2_JDATA ADC_JDR2_JDATA_Msk /*!< ADC group injected sequencer rank 2 conversion data */ + +/******************* Bit definition for ADC_JDR3 register *******************/ +#define ADC_JDR3_JDATA_Pos (0U) +#define ADC_JDR3_JDATA_Msk (0xFFFFUL << ADC_JDR3_JDATA_Pos) /*!< 0x0000FFFF */ +#define ADC_JDR3_JDATA ADC_JDR3_JDATA_Msk /*!< ADC group injected sequencer rank 3 conversion data */ + +/******************* Bit definition for ADC_JDR4 register *******************/ +#define ADC_JDR4_JDATA_Pos (0U) +#define ADC_JDR4_JDATA_Msk (0xFFFFUL << ADC_JDR4_JDATA_Pos) /*!< 0x0000FFFF */ +#define ADC_JDR4_JDATA ADC_JDR4_JDATA_Msk /*!< ADC group injected sequencer rank 4 conversion data */ + +/******************** Bit definition for ADC_DR register ********************/ +#define ADC_DR_DATA_Pos (0U) +#define ADC_DR_DATA_Msk (0xFFFFUL << ADC_DR_DATA_Pos) /*!< 0x0000FFFF */ +#define ADC_DR_DATA ADC_DR_DATA_Msk /*!< ADC group regular conversion data */ +#define ADC_DR_ADC2DATA_Pos (16U) +#define ADC_DR_ADC2DATA_Msk (0xFFFFUL << ADC_DR_ADC2DATA_Pos) /*!< 0xFFFF0000 */ +#define ADC_DR_ADC2DATA ADC_DR_ADC2DATA_Msk /*!< ADC group regular conversion data for ADC slave, in multimode */ + + +/*****************************************************************************/ +/* */ +/* Timers (TIM) */ +/* */ +/*****************************************************************************/ +/******************* Bit definition for TIM_CR1 register *******************/ +#define TIM_CR1_CEN_Pos (0U) +#define TIM_CR1_CEN_Msk (0x1UL << TIM_CR1_CEN_Pos) /*!< 0x00000001 */ +#define TIM_CR1_CEN TIM_CR1_CEN_Msk /*!>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/arcadestick_software/Drivers/CMSIS/Include/cmsis_armclang.h b/arcadestick_software/Drivers/CMSIS/Include/cmsis_armclang.h new file mode 100644 index 0000000..162a400 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1869 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*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 */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#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 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 + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \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"); +} + + +#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"); +} +#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 the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \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 */ + + +/* ########################## 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 + */ +#define __CLZ (uint8_t)__builtin_clz + + +#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) ); + 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) ); + 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) ); + 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) ); +} + + +/** + \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) ); +} + + +/** + \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) ); +} + + +/** + \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 */ + + +/* ################### 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); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + 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) \ +({ \ + 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; \ + }) +#endif + +#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) ) + +__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/arcadestick_software/Drivers/CMSIS/Include/cmsis_compiler.h b/arcadestick_software/Drivers/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 0000000..94212eb --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,266 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * 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 + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/arcadestick_software/Drivers/CMSIS/Include/cmsis_gcc.h b/arcadestick_software/Drivers/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000..2d9db15 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2085 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.4 + * @date 09. April 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_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 + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 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"); +} + + +#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"); +} +#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) :: "memory"); + 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) :: "memory"); + 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 the F-bit in the CPSR. + 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 the F-bit in the CPSR. + 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 */ + + +/* ########################## 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") + + +/** + \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") + + +/** + \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 volatile ("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 volatile ("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 volatile ("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 volatile ("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 + */ +#define __CLZ (uint8_t)__builtin_clz + + +#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 ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __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 ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __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) ); + 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) ); + 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) ); + 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) ); +} + + +/** + \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) ); +} + + +/** + \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) ); +} + + +/** + \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) ); + 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) ); + 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) ); + 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) ); + 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) ); + 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) ); + 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 */ + + +/* ################### 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); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + 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) \ +({ \ + 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; \ + }) +#endif + +#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) ) + +__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 */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/arcadestick_software/Drivers/CMSIS/Include/cmsis_iccarm.h b/arcadestick_software/Drivers/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 0000000..11c4af0 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,935 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/arcadestick_software/Drivers/CMSIS/Include/cmsis_version.h b/arcadestick_software/Drivers/CMSIS/Include/cmsis_version.h new file mode 100644 index 0000000..660f612 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/arcadestick_software/Drivers/CMSIS/Include/core_armv8mbl.h b/arcadestick_software/Drivers/CMSIS/Include/core_armv8mbl.h new file mode 100644 index 0000000..251e4ed --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_armv8mbl.h @@ -0,0 +1,1918 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 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_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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_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) */ + + +/** + \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 */ + uint32_t RESERVED4[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 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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_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 */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA 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_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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 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 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 ) /*!< 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 + + #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) /*!< Core Debug 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) /*!< Core Debug 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 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 (0x00000002UL) /* bit [1] 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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 */ + + + + +/* ################################## 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/arcadestick_software/Drivers/CMSIS/Include/core_armv8mml.h b/arcadestick_software/Drivers/CMSIS/Include/core_armv8mml.h new file mode 100644 index 0000000..3a3148e --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_armv8mml.h @@ -0,0 +1,2927 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_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 (81U) /*!< 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_PCS_VFP + #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 __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_ADR; /*!< 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 RESERVED3[92U]; + __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 */ + uint32_t RESERVED7[6U]; + __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_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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 */ + +/* 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 /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN 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_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_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 */ + __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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} 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 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 */ + +/*@} 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 */ + uint32_t RESERVED4[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 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 + + #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) /*!< Core Debug 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) /*!< Core Debug 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) */ +/*@} */ + + + +/******************************************************************************* + * 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 (0x00000002UL) /* bit [1] 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 << 8U) ); /* Insert write key and priorty 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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 << 8U) ); /* Insert write key and priorty 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 */ + + + + +/* ################################## 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/arcadestick_software/Drivers/CMSIS/Include/core_cm0.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm0.h new file mode 100644 index 0000000..f929bba --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm0.h @@ -0,0 +1,949 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + 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 RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __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/arcadestick_software/Drivers/CMSIS/Include/core_cm0plus.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm0plus.h new file mode 100644 index 0000000..424011a --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,1083 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_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 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 */ +#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) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + 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; +} + + +/** + \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(); + } +} + +/*@} 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/arcadestick_software/Drivers/CMSIS/Include/core_cm1.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm1.h new file mode 100644 index 0000000..0ed678e --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm1.h @@ -0,0 +1,976 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 23. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM1_H_GENERIC +#define __CORE_CM1_H_GENERIC + +#include + +#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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + 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) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __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/arcadestick_software/Drivers/CMSIS/Include/core_cm23.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm23.h new file mode 100644 index 0000000..acbc5df --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm23.h @@ -0,0 +1,1993 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 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_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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_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) */ + + +/** + \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 */ + uint32_t RESERVED4[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 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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_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 */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA 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_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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 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 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 ) /*!< 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 + + #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) /*!< Core Debug 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) /*!< Core Debug 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 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 (0x00000002UL) /* bit [1] 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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 */ + + + + +/* ################################## 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/arcadestick_software/Drivers/CMSIS/Include/core_cm3.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000..74bff64 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm3.h @@ -0,0 +1,1941 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 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_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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_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 __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 RSERVED1[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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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 */ + +#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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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/arcadestick_software/Drivers/CMSIS/Include/core_cm33.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm33.h new file mode 100644 index 0000000..6cd2db7 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm33.h @@ -0,0 +1,3002 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.0.9 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_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_PCS_VFP) + #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 __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_ADR; /*!< 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 RESERVED3[92U]; + __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 */ + uint32_t RESERVED7[6U]; + __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_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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 */ + +/* 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 /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN 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_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_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 */ + __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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} 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 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 */ + +/*@} 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 */ + uint32_t RESERVED4[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 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST 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 */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN 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 + + #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) /*!< Core Debug 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) /*!< Core Debug 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) */ +/*@} */ + + + +/******************************************************************************* + * 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 (0x00000002UL) /* bit [1] 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 << 8U) ); /* 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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 */ + + + + +/* ################################## 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/arcadestick_software/Drivers/CMSIS/Include/core_cm4.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm4.h new file mode 100644 index 0000000..7d56873 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm4.h @@ -0,0 +1,2129 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 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_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_PCS_VFP + #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 __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 RSERVED1[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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 */ +} 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 */ + +/*@} 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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/arcadestick_software/Drivers/CMSIS/Include/core_cm7.h b/arcadestick_software/Drivers/CMSIS/Include/core_cm7.h new file mode 100644 index 0000000..a14dc62 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_cm7.h @@ -0,0 +1,2671 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 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_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_PCS_VFP + #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 __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 RSERVED1[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 */ + uint32_t RESERVED7[6U]; + __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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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 /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN 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_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_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_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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 */ + +/*@} 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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 #################################### */ +/** + \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 ) + + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_INLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __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_INLINE 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_INLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_INLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* 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_INLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* 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_INLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* 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_INLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* 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_INLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* 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 + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t)addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## 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/arcadestick_software/Drivers/CMSIS/Include/core_sc000.h b/arcadestick_software/Drivers/CMSIS/Include/core_sc000.h new file mode 100644 index 0000000..9b67c92 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_sc000.h @@ -0,0 +1,1022 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_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 __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) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief 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; +} + + +/** + \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/arcadestick_software/Drivers/CMSIS/Include/core_sc300.h b/arcadestick_software/Drivers/CMSIS/Include/core_sc300.h new file mode 100644 index 0000000..3e8a471 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/core_sc300.h @@ -0,0 +1,1915 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 04. June 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_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_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_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 __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 RSERVED1[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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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_SHCSR_MEMFAULTACT_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 */ + uint32_t RESERVED1[1U]; +} 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[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + 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 Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 (0x3UL << 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 << 8U) ); /* Insert write key and priorty 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) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((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; +} + + +/** + \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/arcadestick_software/Drivers/CMSIS/Include/mpu_armv7.h b/arcadestick_software/Drivers/CMSIS/Include/mpu_armv7.h new file mode 100644 index 0000000..0142203 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/mpu_armv7.h @@ -0,0 +1,270 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if non-shareable) or 010b (if shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/arcadestick_software/Drivers/CMSIS/Include/mpu_armv8.h b/arcadestick_software/Drivers/CMSIS/Include/mpu_armv8.h new file mode 100644 index 0000000..62571da --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/mpu_armv8.h @@ -0,0 +1,333 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/arcadestick_software/Drivers/CMSIS/Include/tz_context.h b/arcadestick_software/Drivers/CMSIS/Include/tz_context.h new file mode 100644 index 0000000..0d09749 --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/Include/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#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/arcadestick_software/Drivers/CMSIS/LICENSE.txt b/arcadestick_software/Drivers/CMSIS/LICENSE.txt new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/arcadestick_software/Drivers/CMSIS/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h new file mode 100644 index 0000000..f71f5c2 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -0,0 +1,4377 @@ +/** + ****************************************************************************** + * @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) +#define PAGESIZE FLASH_PAGE_SIZE +#endif /* STM32F2 && STM32F4 && STM32F7 && STM32H7 */ +#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(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(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(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) +#define TAMP_SECRETDEVICE_ERASE_NONE TAMP_DEVICESECRETS_ERASE_NONE +#define TAMP_SECRETDEVICE_ERASE_BKP_SRAM TAMP_DEVICESECRETS_ERASE_BKPSRAM +#endif /* STM32H5 || STM32H7RS */ + +#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) +#define TAMP_SECRETDEVICE_ERASE_DISABLE TAMP_DEVICESECRETS_ERASE_NONE +#define TAMP_SECRETDEVICE_ERASE_ENABLE TAMP_SECRETDEVICE_ERASE_ALL +#endif /* STM32H5 || STM32WBA || STM32H7RS */ + +#if defined(STM32F7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_ENABLE_BITS_MASK +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_IT_ENABLE_BITS_MASK +#endif /* STM32F7 */ + +#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) +#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 */ + +/** + * @} + */ + + +/** @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) +#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) +#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 */ + +/** + * @} + */ + +/** @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(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 (STM32H7RS) || defined (STM32U0) +#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 +/** + * @} + */ + +/** @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/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h new file mode 100644 index 0000000..a67a3b9 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h @@ -0,0 +1,357 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_HAL_H +#define __STM32F1xx_HAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_conf.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup HAL + * @{ + */ + +/* 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 types ------------------------------------------------------------*/ +extern __IO uint32_t uwTick; +extern uint32_t uwTickPrio; +extern HAL_TickFreqTypeDef uwTickFreq; + +/** + * @} + */ +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup HAL_Exported_Macros HAL Exported Macros + * @{ + */ + +/** @defgroup DBGMCU_Freeze_Unfreeze Freeze Unfreeze Peripherals in Debug mode + * @brief Freeze/Unfreeze Peripherals in Debug mode + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @{ + */ + +/* Peripherals on APB1 */ +/** + * @brief TIM2 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM2() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM2_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM2() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM2_STOP) + +/** + * @brief TIM3 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM3() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM3_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM3() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM3_STOP) + +#if defined (DBGMCU_CR_DBG_TIM4_STOP) +/** + * @brief TIM4 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM4() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM4_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM4() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM4_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM5_STOP) +/** + * @brief TIM5 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM5() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM5_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM5() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM5_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM6_STOP) +/** + * @brief TIM6 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM6() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM6_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM6() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM6_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM7_STOP) +/** + * @brief TIM7 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM7() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM7_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM7() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM7_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM12_STOP) +/** + * @brief TIM12 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM12() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM12_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM12() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM12_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM13_STOP) +/** + * @brief TIM13 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM13() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM13_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM13() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM13_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM14_STOP) +/** + * @brief TIM14 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM14() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM14_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM14() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM14_STOP) +#endif + +/** + * @brief WWDG Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_WWDG() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_WWDG_STOP) +#define __HAL_DBGMCU_UNFREEZE_WWDG() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_WWDG_STOP) + +/** + * @brief IWDG Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_IWDG() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_IWDG_STOP) +#define __HAL_DBGMCU_UNFREEZE_IWDG() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_IWDG_STOP) + +/** + * @brief I2C1 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT) +#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT) + +#if defined (DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT) +/** + * @brief I2C2 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT) +#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT) +#endif + +#if defined (DBGMCU_CR_DBG_CAN1_STOP) +/** + * @brief CAN1 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_CAN1() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_CAN1_STOP) +#define __HAL_DBGMCU_UNFREEZE_CAN1() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_CAN1_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_CAN2_STOP) +/** + * @brief CAN2 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_CAN2() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_CAN2_STOP) +#define __HAL_DBGMCU_UNFREEZE_CAN2() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_CAN2_STOP) +#endif + +/* Peripherals on APB2 */ +#if defined (DBGMCU_CR_DBG_TIM1_STOP) +/** + * @brief TIM1 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM1() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM1_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM1() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM1_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM8_STOP) +/** + * @brief TIM8 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM8() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM8_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM8() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM8_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM9_STOP) +/** + * @brief TIM9 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM9() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM9_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM9() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM9_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM10_STOP) +/** + * @brief TIM10 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM10() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM10_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM10() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM10_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM11_STOP) +/** + * @brief TIM11 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM11() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM11_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM11() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM11_STOP) +#endif + + +#if defined (DBGMCU_CR_DBG_TIM15_STOP) +/** + * @brief TIM15 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM15() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM15_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM15() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM15_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM16_STOP) +/** + * @brief TIM16 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM16() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM16_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM16() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM16_STOP) +#endif + +#if defined (DBGMCU_CR_DBG_TIM17_STOP) +/** + * @brief TIM17 Peripherals Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM17() SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM17_STOP) +#define __HAL_DBGMCU_UNFREEZE_TIM17() CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_TIM17_STOP) +#endif + +/** + * @} + */ + +/** @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 functions --------------------------------------------------------*/ +/** @addtogroup HAL_Exported_Functions + * @{ + */ +/** @addtogroup HAL_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization 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); +uint32_t HAL_GetUIDw0(void); +uint32_t HAL_GetUIDw1(void); +uint32_t HAL_GetUIDw2(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); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/* 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 /* __STM32F1xx_HAL_H */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h new file mode 100644 index 0000000..7cfefbd --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h @@ -0,0 +1,410 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_HAL_CORTEX_H +#define __STM32F1xx_HAL_CORTEX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_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 */ +/** + * @} + */ + +/** + * @} + */ + +/* 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 /* __STM32F1xx_HAL_CORTEX_H */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h new file mode 100644 index 0000000..d4d98f7 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h @@ -0,0 +1,211 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_HAL_DEF +#define __STM32F1xx_HAL_DEF + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.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 ------------------------------------------------------------*/ +#define HAL_MAX_DELAY 0xFFFFFFFFU + +#define HAL_IS_BIT_SET(REG, BIT) (((REG) & (BIT)) != 0U) +#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) + +#if !defined(UNUSED) +#define UNUSED(X) (void)X /* To avoid gcc/g++ warnings */ +#endif /* UNUSED */ + +/** @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 /* ___STM32F1xx_HAL_DEF */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h new file mode 100644 index 0000000..2eff9ac --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h @@ -0,0 +1,455 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_dma.h + * @author MCD Application Team + * @brief Header file of DMA 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 __STM32F1xx_HAL_DMA_H +#define __STM32F1xx_HAL_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Types DMA Exported Types + * @{ + */ + +/** + * @brief DMA Configuration Structure definition + */ +typedef struct +{ + 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 Channelx. + 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 Channel */ + + uint32_t Priority; /*!< Specifies the software priority for the DMAy Channelx. + This parameter can be a value of @ref DMA_Priority_level */ +} 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_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 Callback ID 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_ERROR_CB_ID = 0x02U, /*!< Error */ + HAL_DMA_XFER_ABORT_CB_ID = 0x03U, /*!< Abort */ + HAL_DMA_XFER_ALL_CB_ID = 0x04U /*!< All */ + +}HAL_DMA_CallbackIDTypeDef; + +/** + * @brief DMA handle Structure definition + */ +typedef struct __DMA_HandleTypeDef +{ + DMA_Channel_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 (* 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 */ + + DMA_TypeDef *DmaBaseAddress; /*!< DMA Channel Base Address */ + + uint32_t ChannelIndex; /*!< DMA Channel Index */ + +} DMA_HandleTypeDef; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Constants DMA Exported Constants + * @{ + */ + +/** @defgroup DMA_Error_Code DMA Error Code + * @{ + */ +#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ +#define HAL_DMA_ERROR_NO_XFER 0x00000004U /*!< no ongoing transfer */ +#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ +/** + * @} + */ + +/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction + * @{ + */ +#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_CCR_DIR) /*!< Memory to peripheral direction */ +#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_CCR_MEM2MEM) /*!< Memory to memory direction */ + +/** + * @} + */ + +/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode + * @{ + */ +#define DMA_PINC_ENABLE ((uint32_t)DMA_CCR_PINC) /*!< Peripheral increment mode Enable */ +#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode Disable */ +/** + * @} + */ + +/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode + * @{ + */ +#define DMA_MINC_ENABLE ((uint32_t)DMA_CCR_MINC) /*!< Memory increment mode Enable */ +#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode Disable */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size + * @{ + */ +#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ +#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_CCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ +#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_CCR_PSIZE_1) /*!< Peripheral data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_Memory_data_size DMA Memory data size + * @{ + */ +#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ +#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_CCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ +#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_CCR_MSIZE_1) /*!< Memory data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_mode DMA mode + * @{ + */ +#define DMA_NORMAL 0x00000000U /*!< Normal mode */ +#define DMA_CIRCULAR ((uint32_t)DMA_CCR_CIRC) /*!< Circular mode */ +/** + * @} + */ + +/** @defgroup DMA_Priority_level DMA Priority level + * @{ + */ +#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ +#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_CCR_PL_0) /*!< Priority level : Medium */ +#define DMA_PRIORITY_HIGH ((uint32_t)DMA_CCR_PL_1) /*!< Priority level : High */ +#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_CCR_PL) /*!< Priority level : Very_High */ +/** + * @} + */ + + +/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions + * @{ + */ +#define DMA_IT_TC ((uint32_t)DMA_CCR_TCIE) +#define DMA_IT_HT ((uint32_t)DMA_CCR_HTIE) +#define DMA_IT_TE ((uint32_t)DMA_CCR_TEIE) +/** + * @} + */ + +/** @defgroup DMA_flag_definitions DMA flag definitions + * @{ + */ +#define DMA_FLAG_GL1 0x00000001U +#define DMA_FLAG_TC1 0x00000002U +#define DMA_FLAG_HT1 0x00000004U +#define DMA_FLAG_TE1 0x00000008U +#define DMA_FLAG_GL2 0x00000010U +#define DMA_FLAG_TC2 0x00000020U +#define DMA_FLAG_HT2 0x00000040U +#define DMA_FLAG_TE2 0x00000080U +#define DMA_FLAG_GL3 0x00000100U +#define DMA_FLAG_TC3 0x00000200U +#define DMA_FLAG_HT3 0x00000400U +#define DMA_FLAG_TE3 0x00000800U +#define DMA_FLAG_GL4 0x00001000U +#define DMA_FLAG_TC4 0x00002000U +#define DMA_FLAG_HT4 0x00004000U +#define DMA_FLAG_TE4 0x00008000U +#define DMA_FLAG_GL5 0x00010000U +#define DMA_FLAG_TC5 0x00020000U +#define DMA_FLAG_HT5 0x00040000U +#define DMA_FLAG_TE5 0x00080000U +#define DMA_FLAG_GL6 0x00100000U +#define DMA_FLAG_TC6 0x00200000U +#define DMA_FLAG_HT6 0x00400000U +#define DMA_FLAG_TE6 0x00800000U +#define DMA_FLAG_GL7 0x01000000U +#define DMA_FLAG_TC7 0x02000000U +#define DMA_FLAG_HT7 0x04000000U +#define DMA_FLAG_TE7 0x08000000U +/** + * @} + */ + +/** + * @} + */ + + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup DMA_Exported_Macros DMA Exported Macros + * @{ + */ + +/** @brief Reset DMA handle state. + * @param __HANDLE__: DMA handle + * @retval None + */ +#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) + +/** + * @brief Enable the specified DMA Channel. + * @param __HANDLE__: DMA handle + * @retval None + */ +#define __HAL_DMA_ENABLE(__HANDLE__) (SET_BIT((__HANDLE__)->Instance->CCR, DMA_CCR_EN)) + +/** + * @brief Disable the specified DMA Channel. + * @param __HANDLE__: DMA handle + * @retval None + */ +#define __HAL_DMA_DISABLE(__HANDLE__) (CLEAR_BIT((__HANDLE__)->Instance->CCR, DMA_CCR_EN)) + + +/* Interrupt & Flag management */ + +/** + * @brief Enables the specified DMA Channel 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 + * @retval None + */ +#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (SET_BIT((__HANDLE__)->Instance->CCR, (__INTERRUPT__))) + +/** + * @brief Disable the specified DMA Channel 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 + * @retval None + */ +#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (CLEAR_BIT((__HANDLE__)->Instance->CCR , (__INTERRUPT__))) + +/** + * @brief Check whether the specified DMA Channel interrupt is enabled or not. + * @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 + * @retval The state of DMA_IT (SET or RESET). + */ +#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CCR & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +/** + * @brief Return the number of remaining data units in the current DMA Channel transfer. + * @param __HANDLE__: DMA handle + * @retval The number of remaining data units in the current DMA Channel transfer. + */ +#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNDTR) + +/** + * @} + */ + +/* Include DMA HAL Extension module */ +#include "stm32f1xx_hal_dma_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup DMA_Exported_Functions + * @{ + */ + +/** @addtogroup DMA_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_DeInit (DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group2 + * @{ + */ +/* IO 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, uint32_t CompleteLevel, uint32_t Timeout); +void HAL_DMA_IRQHandler(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); + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group3 + * @{ + */ +/* Peripheral State and Error functions ***************************************/ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup DMA_Private_Macros DMA Private Macros + * @{ + */ + +#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) >= 0x1U) && ((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)) + +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ + ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ + ((PRIORITY) == DMA_PRIORITY_HIGH) || \ + ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_DMA_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h new file mode 100644 index 0000000..ce31cff --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h @@ -0,0 +1,275 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_dma_ex.h + * @author MCD Application Team + * @brief Header file of DMA 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 __STM32F1xx_HAL_DMA_EX_H +#define __STM32F1xx_HAL_DMA_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup DMAEx DMAEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Macros DMA Extended Exported Macros + * @{ + */ +/* Interrupt & Flag management */ +#if defined (STM32F100xE) || defined (STM32F101xE) || defined (STM32F101xG) || defined (STM32F103xE) || \ + defined (STM32F103xG) || defined (STM32F105xC) || defined (STM32F107xC) +/** @defgroup DMAEx_High_density_XL_density_Product_devices DMAEx High density and XL density product devices + * @{ + */ + +/** + * @brief Returns the current DMA Channel 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_Channel1))? DMA_FLAG_TC1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_TC2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_TC3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_TC4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_TC5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_TC6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel7))? DMA_FLAG_TC7 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_TC1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_TC2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_TC3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_TC4 :\ + DMA_FLAG_TC5) + +/** + * @brief Returns the current DMA Channel 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_Channel1))? DMA_FLAG_HT1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_HT2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_HT3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_HT4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_HT5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_HT6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel7))? DMA_FLAG_HT7 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_HT1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_HT2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_HT3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_HT4 :\ + DMA_FLAG_HT5) + +/** + * @brief Returns the current DMA Channel 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_Channel1))? DMA_FLAG_TE1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_TE2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_TE3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_TE4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_TE5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_TE6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel7))? DMA_FLAG_TE7 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_TE1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_TE2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_TE3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_TE4 :\ + DMA_FLAG_TE5) + +/** + * @brief Return the current DMA Channel Global interrupt flag. + * @param __HANDLE__: DMA handle + * @retval The specified transfer error flag index. + */ +#define __HAL_DMA_GET_GI_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel1))? DMA_FLAG_GL1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_GL2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_GL3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_GL4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_GL5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_GL6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel7))? DMA_FLAG_GL7 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel1))? DMA_FLAG_GL1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel2))? DMA_FLAG_GL2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel3))? DMA_FLAG_GL3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Channel4))? DMA_FLAG_GL4 :\ + DMA_FLAG_GL5) + +/** + * @brief Get the DMA Channel 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_TCx: Transfer complete flag + * @arg DMA_FLAG_HTx: Half transfer complete flag + * @arg DMA_FLAG_TEx: Transfer error flag + * Where x can be 1_7 or 1_5 (depending on DMA1 or DMA2) to select the DMA Channel flag. + * @retval The state of FLAG (SET or RESET). + */ +#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Channel7)? (DMA2->ISR & (__FLAG__)) :\ + (DMA1->ISR & (__FLAG__))) + +/** + * @brief Clears the DMA Channel 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_TCx: Transfer complete flag + * @arg DMA_FLAG_HTx: Half transfer complete flag + * @arg DMA_FLAG_TEx: Transfer error flag + * Where x can be 1_7 or 1_5 (depending on DMA1 or DMA2) to select the DMA Channel flag. + * @retval None + */ +#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Channel7)? (DMA2->IFCR = (__FLAG__)) :\ + (DMA1->IFCR = (__FLAG__))) + +/** + * @} + */ + +#else +/** @defgroup DMA_Low_density_Medium_density_Product_devices DMA Low density and Medium density product devices + * @{ + */ + +/** + * @brief Returns the current DMA Channel 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_Channel1))? DMA_FLAG_TC1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_TC2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_TC3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_TC4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_TC5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_TC6 :\ + DMA_FLAG_TC7) + +/** + * @brief Return the current DMA Channel 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_Channel1))? DMA_FLAG_HT1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_HT2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_HT3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_HT4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_HT5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_HT6 :\ + DMA_FLAG_HT7) + +/** + * @brief Return the current DMA Channel 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_Channel1))? DMA_FLAG_TE1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_TE2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_TE3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_TE4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_TE5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_TE6 :\ + DMA_FLAG_TE7) + +/** + * @brief Return the current DMA Channel Global interrupt flag. + * @param __HANDLE__: DMA handle + * @retval The specified transfer error flag index. + */ +#define __HAL_DMA_GET_GI_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel1))? DMA_FLAG_GL1 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel2))? DMA_FLAG_GL2 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel3))? DMA_FLAG_GL3 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel4))? DMA_FLAG_GL4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel5))? DMA_FLAG_GL5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Channel6))? DMA_FLAG_GL6 :\ + DMA_FLAG_GL7) + +/** + * @brief Get the DMA Channel 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_TCx: Transfer complete flag + * @arg DMA_FLAG_HTx: Half transfer complete flag + * @arg DMA_FLAG_TEx: Transfer error flag + * @arg DMA_FLAG_GLx: Global interrupt flag + * Where x can be 1_7 to select the DMA Channel flag. + * @retval The state of FLAG (SET or RESET). + */ + +#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__) (DMA1->ISR & (__FLAG__)) + +/** + * @brief Clear the DMA Channel 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_TCx: Transfer complete flag + * @arg DMA_FLAG_HTx: Half transfer complete flag + * @arg DMA_FLAG_TEx: Transfer error flag + * @arg DMA_FLAG_GLx: Global interrupt flag + * Where x can be 1_7 to select the DMA Channel flag. + * @retval None + */ +#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) (DMA1->IFCR = (__FLAG__)) + +/** + * @} + */ + +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || */ + /* STM32F103xG || STM32F105xC || STM32F107xC */ + +#endif /* __STM32F1xx_HAL_DMA_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h new file mode 100644 index 0000000..14baf44 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_exti.h @@ -0,0 +1,318 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_exti.h + * @author MCD Application Team + * @brief Header file of EXTI HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F1xx_HAL_EXTI_H +#define STM32F1xx_HAL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup EXTI EXTI + * @brief EXTI HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup EXTI_Exported_Types EXTI Exported Types + * @{ + */ + +/** + * @brief HAL EXTI common Callback ID enumeration definition + */ +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 Wakeup from suspend event */ +#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 */ +#endif /* EXTI_IMR_IM19 */ + +/** + * @} + */ + +/** @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 +#define EXTI_GPIOD 0x00000003u +#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 */ +/** + * @} + */ + +/** + * @} + */ + +/* 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_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_IM19) +#define EXTI_LINE_NB 20UL +#elif defined(EXTI_IMR_IM18) +#define EXTI_LINE_NB 19UL +#else /* EXTI_IMR_IM17 */ +#define EXTI_LINE_NB 18UL +#endif /* EXTI_IMR_IM19 */ +/** + * @} + */ + +/* 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 (GPIOG) +#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)) +#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_GPIOF)) +#elif defined (GPIOE) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD)) +#endif /* GPIOG */ + +#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 /* STM32F1xx_HAL_EXTI_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h new file mode 100644 index 0000000..2479847 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h @@ -0,0 +1,325 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_flash.h + * @author MCD Application Team + * @brief Header file of Flash 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 __STM32F1xx_HAL_FLASH_H +#define __STM32F1xx_HAL_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/** @addtogroup FLASH_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ + +/** @addtogroup FLASH_Private_Macros + * @{ + */ + +#define IS_FLASH_TYPEPROGRAM(VALUE) (((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) + +#if defined(FLASH_ACR_LATENCY) +#define IS_FLASH_LATENCY(__LATENCY__) (((__LATENCY__) == FLASH_LATENCY_0) || \ + ((__LATENCY__) == FLASH_LATENCY_1) || \ + ((__LATENCY__) == FLASH_LATENCY_2)) + +#else +#define IS_FLASH_LATENCY(__LATENCY__) ((__LATENCY__) == FLASH_LATENCY_0) +#endif /* FLASH_ACR_LATENCY */ +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Procedure structure definition + */ +typedef enum +{ + FLASH_PROC_NONE = 0U, + FLASH_PROC_PAGEERASE = 1U, + FLASH_PROC_MASSERASE = 2U, + FLASH_PROC_PROGRAMHALFWORD = 3U, + FLASH_PROC_PROGRAMWORD = 4U, + FLASH_PROC_PROGRAMDOUBLEWORD = 5U +} 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 DataRemaining; /*!< Internal variable to save the remaining pages to erase or half-word to program in IT context */ + + __IO uint32_t Address; /*!< Internal variable to save address selected for program or erase */ + + __IO uint64_t Data; /*!< Internal variable to save data to be programmed */ + + HAL_LockTypeDef Lock; /*!< FLASH locking object */ + + __IO uint32_t ErrorCode; /*!< FLASH error code + This parameter can be a value of @ref FLASH_Error_Codes */ +} FLASH_ProcessTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Constants FLASH Exported Constants + * @{ + */ + +/** @defgroup FLASH_Error_Codes FLASH Error Codes + * @{ + */ + +#define HAL_FLASH_ERROR_NONE 0x00U /*!< No error */ +#define HAL_FLASH_ERROR_PROG 0x01U /*!< Programming error */ +#define HAL_FLASH_ERROR_WRP 0x02U /*!< Write protection error */ +#define HAL_FLASH_ERROR_OPTV 0x04U /*!< Option validity error */ + +/** + * @} + */ + +/** @defgroup FLASH_Type_Program FLASH Type Program + * @{ + */ +#define FLASH_TYPEPROGRAM_HALFWORD 0x01U /*!ACR |= FLASH_ACR_HLFCYA) + +/** + * @brief Disable the FLASH half cycle access. + * @note half cycle access can only be used with a low-frequency clock of less than + 8 MHz that can be obtained with the use of HSI or HSE but not of PLL. + * @retval None + */ +#define __HAL_FLASH_HALF_CYCLE_ACCESS_DISABLE() (FLASH->ACR &= (~FLASH_ACR_HLFCYA)) + +/** + * @} + */ + +#if defined(FLASH_ACR_LATENCY) +/** @defgroup FLASH_EM_Latency FLASH Latency + * @brief macros to handle FLASH Latency + * @{ + */ + +/** + * @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__) (FLASH->ACR = (FLASH->ACR&(~FLASH_ACR_LATENCY)) | (__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)) + +/** + * @} + */ + +#endif /* FLASH_ACR_LATENCY */ +/** @defgroup FLASH_Prefetch FLASH Prefetch + * @brief macros to handle FLASH Prefetch buffer + * @{ + */ +/** + * @brief Enable the FLASH prefetch buffer. + * @retval None + */ +#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTBE) + +/** + * @brief Disable the FLASH prefetch buffer. + * @retval None + */ +#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTBE)) + +/** + * @} + */ + +/** + * @} + */ + +/* Include FLASH HAL Extended module */ +#include "stm32f1xx_hal_flash_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_Exported_Functions + * @{ + */ + +/** @addtogroup FLASH_Exported_Functions_Group1 + * @{ + */ +/* IO 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 function */ +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); +void HAL_FLASH_OB_Launch(void); + +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group3 + * @{ + */ +/* Peripheral State and Error functions ***************************************/ +uint32_t HAL_FLASH_GetError(void); + +/** + * @} + */ + +/** + * @} + */ + +/* Private function -------------------------------------------------*/ +/** @addtogroup FLASH_Private_Functions + * @{ + */ +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +#if defined(FLASH_BANK2_END) +HAL_StatusTypeDef FLASH_WaitForLastOperationBank2(uint32_t Timeout); +#endif /* FLASH_BANK2_END */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_FLASH_H */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h new file mode 100644 index 0000000..5283526 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h @@ -0,0 +1,783 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_flash_ex.h + * @author MCD Application Team + * @brief Header file of Flash 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 __STM32F1xx_HAL_FLASH_EX_H +#define __STM32F1xx_HAL_FLASH_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASHEx + * @{ + */ + +/** @addtogroup FLASHEx_Private_Constants + * @{ + */ + +#define FLASH_SIZE_DATA_REGISTER 0x1FFFF7E0U +#define OBR_REG_INDEX 1U +#define SR_FLAG_MASK ((uint32_t)(FLASH_SR_BSY | FLASH_SR_PGERR | FLASH_SR_WRPRTERR | FLASH_SR_EOP)) + +/** + * @} + */ + +/** @addtogroup FLASHEx_Private_Macros + * @{ + */ + +#define IS_FLASH_TYPEERASE(VALUE) (((VALUE) == FLASH_TYPEERASE_PAGES) || ((VALUE) == FLASH_TYPEERASE_MASSERASE)) + +#define IS_OPTIONBYTE(VALUE) (((VALUE) <= (OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER | OPTIONBYTE_DATA))) + +#define IS_WRPSTATE(VALUE) (((VALUE) == OB_WRPSTATE_DISABLE) || ((VALUE) == OB_WRPSTATE_ENABLE)) + +#define IS_OB_RDP_LEVEL(LEVEL) (((LEVEL) == OB_RDP_LEVEL_0) || ((LEVEL) == OB_RDP_LEVEL_1)) + +#define IS_OB_DATA_ADDRESS(ADDRESS) (((ADDRESS) == OB_DATA_ADDRESS_DATA0) || ((ADDRESS) == OB_DATA_ADDRESS_DATA1)) + +#define IS_OB_IWDG_SOURCE(SOURCE) (((SOURCE) == OB_IWDG_SW) || ((SOURCE) == OB_IWDG_HW)) + +#define IS_OB_STOP_SOURCE(SOURCE) (((SOURCE) == OB_STOP_NO_RST) || ((SOURCE) == OB_STOP_RST)) + +#define IS_OB_STDBY_SOURCE(SOURCE) (((SOURCE) == OB_STDBY_NO_RST) || ((SOURCE) == OB_STDBY_RST)) + +#if defined(FLASH_BANK2_END) +#define IS_OB_BOOT1(BOOT1) (((BOOT1) == OB_BOOT1_RESET) || ((BOOT1) == OB_BOOT1_SET)) +#endif /* FLASH_BANK2_END */ + +/* Low Density */ +#if (defined(STM32F101x6) || defined(STM32F102x6) || defined(STM32F103x6)) +#define IS_FLASH_NB_PAGES(ADDRESS,NBPAGES) (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x20U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)- 1 <= 0x08007FFFU) : \ + ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)- 1 <= 0x08003FFFU)) +#endif /* STM32F101x6 || STM32F102x6 || STM32F103x6 */ + +/* Medium Density */ +#if (defined(STM32F100xB) || defined(STM32F101xB) || defined(STM32F102xB) || defined(STM32F103xB)) +#define IS_FLASH_NB_PAGES(ADDRESS,NBPAGES) (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x80U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0801FFFFU) : \ + (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x40U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0800FFFFU) : \ + (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x20U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x08007FFFU) : \ + ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x08003FFFU)))) +#endif /* STM32F100xB || STM32F101xB || STM32F102xB || STM32F103xB*/ + +/* High Density */ +#if (defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F103xE)) +#define IS_FLASH_NB_PAGES(ADDRESS,NBPAGES) (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x200U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0807FFFFU) : \ + (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x180U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0805FFFFU) : \ + ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0803FFFFU))) +#endif /* STM32F100xE || STM32F101xE || STM32F103xE */ + +/* XL Density */ +#if defined(FLASH_BANK2_END) +#define IS_FLASH_NB_PAGES(ADDRESS,NBPAGES) (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x400U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x080FFFFFU) : \ + ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x080BFFFFU)) +#endif /* FLASH_BANK2_END */ + +/* Connectivity Line */ +#if (defined(STM32F105xC) || defined(STM32F107xC)) +#define IS_FLASH_NB_PAGES(ADDRESS,NBPAGES) (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x100U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0803FFFFU) : \ + (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x80U) ? ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0801FFFFU) : \ + ((ADDRESS)+((NBPAGES)*FLASH_PAGE_SIZE)-1 <= 0x0800FFFFU))) +#endif /* STM32F105xC || STM32F107xC */ + +#define IS_OB_WRP(PAGE) (((PAGE) != 0x0000000U)) + +#if defined(FLASH_BANK2_END) +#define IS_FLASH_BANK(BANK) (((BANK) == FLASH_BANK_1) || \ + ((BANK) == FLASH_BANK_2) || \ + ((BANK) == FLASH_BANK_BOTH)) +#else +#define IS_FLASH_BANK(BANK) (((BANK) == FLASH_BANK_1)) +#endif /* FLASH_BANK2_END */ + +/* Low Density */ +#if (defined(STM32F101x6) || defined(STM32F102x6) || defined(STM32F103x6)) +#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x20U) ? \ + ((ADDRESS) <= FLASH_BANK1_END) : ((ADDRESS) <= 0x08003FFFU))) + +#endif /* STM32F101x6 || STM32F102x6 || STM32F103x6 */ + +/* Medium Density */ +#if (defined(STM32F100xB) || defined(STM32F101xB) || defined(STM32F102xB) || defined(STM32F103xB)) +#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x80U) ? \ + ((ADDRESS) <= FLASH_BANK1_END) : (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x40U) ? \ + ((ADDRESS) <= 0x0800FFFF) : (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x20U) ? \ + ((ADDRESS) <= 0x08007FFF) : ((ADDRESS) <= 0x08003FFFU))))) + +#endif /* STM32F100xB || STM32F101xB || STM32F102xB || STM32F103xB*/ + +/* High Density */ +#if (defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F103xE)) +#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x200U) ? \ + ((ADDRESS) <= FLASH_BANK1_END) : (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x180U) ? \ + ((ADDRESS) <= 0x0805FFFFU) : ((ADDRESS) <= 0x0803FFFFU)))) + +#endif /* STM32F100xE || STM32F101xE || STM32F103xE */ + +/* XL Density */ +#if defined(FLASH_BANK2_END) +#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x400U) ? \ + ((ADDRESS) <= FLASH_BANK2_END) : ((ADDRESS) <= 0x080BFFFFU))) + +#endif /* FLASH_BANK2_END */ + +/* Connectivity Line */ +#if (defined(STM32F105xC) || defined(STM32F107xC)) +#define IS_FLASH_PROGRAM_ADDRESS(ADDRESS) (((ADDRESS) >= FLASH_BASE) && (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x100U) ? \ + ((ADDRESS) <= FLASH_BANK1_END) : (((*((uint16_t *)FLASH_SIZE_DATA_REGISTER)) == 0x80U) ? \ + ((ADDRESS) <= 0x0801FFFFU) : ((ADDRESS) <= 0x0800FFFFU)))) + +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Types FLASHEx Exported Types + * @{ + */ + +/** + * @brief FLASH Erase structure definition + */ +typedef struct +{ + uint32_t TypeErase; /*!< TypeErase: Mass erase or page 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 PageAddress; /*!< PageAdress: Initial FLASH page address to erase when mass erase is disabled + This parameter must be a number between Min_Data = 0x08000000 and Max_Data = FLASH_BANKx_END + (x = 1 or 2 depending on devices)*/ + + uint32_t NbPages; /*!< NbPages: Number of pagess to be erased. + This parameter must be a value between Min_Data = 1 and Max_Data = (max number of pages - value of initial page)*/ + +} FLASH_EraseInitTypeDef; + +/** + * @brief FLASH Options bytes program structure definition + */ +typedef struct +{ + uint32_t OptionType; /*!< OptionType: Option byte to be configured. + This parameter can be a value of @ref FLASHEx_OB_Type */ + + uint32_t WRPState; /*!< WRPState: Write protection activation or deactivation. + This parameter can be a value of @ref FLASHEx_OB_WRP_State */ + + uint32_t WRPPage; /*!< WRPPage: specifies the page(s) to be write protected + This parameter can be a value of @ref FLASHEx_OB_Write_Protection */ + + uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint8_t RDPLevel; /*!< RDPLevel: Set the read protection level.. + This parameter can be a value of @ref FLASHEx_OB_Read_Protection */ + +#if defined(FLASH_BANK2_END) + uint8_t USERConfig; /*!< USERConfig: Program the FLASH User Option Byte: + IWDG / STOP / STDBY / BOOT1 + This parameter can be a combination of @ref FLASHEx_OB_IWatchdog, @ref FLASHEx_OB_nRST_STOP, + @ref FLASHEx_OB_nRST_STDBY, @ref FLASHEx_OB_BOOT1 */ +#else + uint8_t USERConfig; /*!< USERConfig: Program the FLASH User Option Byte: + IWDG / STOP / STDBY + This parameter can be a combination of @ref FLASHEx_OB_IWatchdog, @ref FLASHEx_OB_nRST_STOP, + @ref FLASHEx_OB_nRST_STDBY */ +#endif /* FLASH_BANK2_END */ + + uint32_t DATAAddress; /*!< DATAAddress: Address of the option byte DATA to be programmed + This parameter can be a value of @ref FLASHEx_OB_Data_Address */ + + uint8_t DATAData; /*!< DATAData: Data to be stored in the option byte DATA + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ +} FLASH_OBProgramInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Constants FLASHEx Exported Constants + * @{ + */ + +/** @defgroup FLASHEx_Constants FLASH Constants + * @{ + */ + +/** @defgroup FLASHEx_Page_Size Page Size + * @{ + */ +#if (defined(STM32F101x6) || defined(STM32F102x6) || defined(STM32F103x6) || defined(STM32F100xB) || defined(STM32F101xB) || defined(STM32F102xB) || defined(STM32F103xB)) +#define FLASH_PAGE_SIZE 0x400U +#endif /* STM32F101x6 || STM32F102x6 || STM32F103x6 */ + /* STM32F100xB || STM32F101xB || STM32F102xB || STM32F103xB */ + +#if (defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG) || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC)) +#define FLASH_PAGE_SIZE 0x800U +#endif /* STM32F100xB || STM32F101xB || STM32F102xB || STM32F103xB */ + /* STM32F101xG || STM32F103xG */ + /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/** @defgroup FLASHEx_Type_Erase Type Erase + * @{ + */ +#define FLASH_TYPEERASE_PAGES 0x00U /*!CR, ((__INTERRUPT__) & 0x0000FFFFU)); \ + /* Enable Bank2 IT */ \ + SET_BIT(FLASH->CR2, ((__INTERRUPT__) >> 16U)); \ + } while(0U) + +/** + * @brief Disable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg @ref FLASH_IT_EOP_BANK1 End of FLASH Operation Interrupt on bank1 + * @arg @ref FLASH_IT_ERR_BANK1 Error Interrupt on bank1 + * @arg @ref FLASH_IT_EOP_BANK2 End of FLASH Operation Interrupt on bank2 + * @arg @ref FLASH_IT_ERR_BANK2 Error Interrupt on bank2 + * @retval none + */ +#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) do { \ + /* Disable Bank1 IT */ \ + CLEAR_BIT(FLASH->CR, ((__INTERRUPT__) & 0x0000FFFFU)); \ + /* Disable Bank2 IT */ \ + CLEAR_BIT(FLASH->CR2, ((__INTERRUPT__) >> 16U)); \ + } while(0U) + +/** + * @brief Get the specified FLASH flag status. + * @param __FLAG__ specifies the FLASH flag to check. + * This parameter can be one of the following values: + * @arg @ref FLASH_FLAG_EOP_BANK1 FLASH End of Operation flag on bank1 + * @arg @ref FLASH_FLAG_WRPERR_BANK1 FLASH Write protected error flag on bank1 + * @arg @ref FLASH_FLAG_PGERR_BANK1 FLASH Programming error flag on bank1 + * @arg @ref FLASH_FLAG_BSY_BANK1 FLASH Busy flag on bank1 + * @arg @ref FLASH_FLAG_EOP_BANK2 FLASH End of Operation flag on bank2 + * @arg @ref FLASH_FLAG_WRPERR_BANK2 FLASH Write protected error flag on bank2 + * @arg @ref FLASH_FLAG_PGERR_BANK2 FLASH Programming error flag on bank2 + * @arg @ref FLASH_FLAG_BSY_BANK2 FLASH Busy flag on bank2 + * @arg @ref FLASH_FLAG_OPTVERR Loaded OB and its complement do not match + * @retval The new state of __FLAG__ (SET or RESET). + */ +#define __HAL_FLASH_GET_FLAG(__FLAG__) (((__FLAG__) == FLASH_FLAG_OPTVERR) ? \ + (FLASH->OBR & FLASH_OBR_OPTERR) : \ + ((((__FLAG__) & SR_FLAG_MASK) != RESET)? \ + (FLASH->SR & ((__FLAG__) & SR_FLAG_MASK)) : \ + (FLASH->SR2 & ((__FLAG__) >> 16U)))) + +/** + * @brief Clear the specified FLASH flag. + * @param __FLAG__ specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg @ref FLASH_FLAG_EOP_BANK1 FLASH End of Operation flag on bank1 + * @arg @ref FLASH_FLAG_WRPERR_BANK1 FLASH Write protected error flag on bank1 + * @arg @ref FLASH_FLAG_PGERR_BANK1 FLASH Programming error flag on bank1 + * @arg @ref FLASH_FLAG_BSY_BANK1 FLASH Busy flag on bank1 + * @arg @ref FLASH_FLAG_EOP_BANK2 FLASH End of Operation flag on bank2 + * @arg @ref FLASH_FLAG_WRPERR_BANK2 FLASH Write protected error flag on bank2 + * @arg @ref FLASH_FLAG_PGERR_BANK2 FLASH Programming error flag on bank2 + * @arg @ref FLASH_FLAG_BSY_BANK2 FLASH Busy flag on bank2 + * @arg @ref FLASH_FLAG_OPTVERR Loaded OB and its complement do not match + * @retval none + */ +#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) do { \ + /* Clear FLASH_FLAG_OPTVERR flag */ \ + if ((__FLAG__) == FLASH_FLAG_OPTVERR) \ + { \ + CLEAR_BIT(FLASH->OBR, FLASH_OBR_OPTERR); \ + } \ + else { \ + /* Clear Flag in Bank1 */ \ + if (((__FLAG__) & SR_FLAG_MASK) != RESET) \ + { \ + FLASH->SR = ((__FLAG__) & SR_FLAG_MASK); \ + } \ + /* Clear Flag in Bank2 */ \ + if (((__FLAG__) >> 16U) != RESET) \ + { \ + FLASH->SR2 = ((__FLAG__) >> 16U); \ + } \ + } \ + } while(0U) +#else +/** + * @brief Enable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg @ref FLASH_IT_EOP End of FLASH Operation Interrupt + * @arg @ref 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 @ref FLASH_IT_EOP End of FLASH Operation Interrupt + * @arg @ref FLASH_IT_ERR Error Interrupt + * @retval none + */ +#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(__INTERRUPT__)) + +/** + * @brief Get the specified FLASH flag status. + * @param __FLAG__ specifies the FLASH flag to check. + * This parameter can be one of the following values: + * @arg @ref FLASH_FLAG_EOP FLASH End of Operation flag + * @arg @ref FLASH_FLAG_WRPERR FLASH Write protected error flag + * @arg @ref FLASH_FLAG_PGERR FLASH Programming error flag + * @arg @ref FLASH_FLAG_BSY FLASH Busy flag + * @arg @ref FLASH_FLAG_OPTVERR Loaded OB and its complement do not match + * @retval The new state of __FLAG__ (SET or RESET). + */ +#define __HAL_FLASH_GET_FLAG(__FLAG__) (((__FLAG__) == FLASH_FLAG_OPTVERR) ? \ + (FLASH->OBR & FLASH_OBR_OPTERR) : \ + (FLASH->SR & (__FLAG__))) +/** + * @brief Clear the specified FLASH flag. + * @param __FLAG__ specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg @ref FLASH_FLAG_EOP FLASH End of Operation flag + * @arg @ref FLASH_FLAG_WRPERR FLASH Write protected error flag + * @arg @ref FLASH_FLAG_PGERR FLASH Programming error flag + * @arg @ref FLASH_FLAG_OPTVERR Loaded OB and its complement do not match + * @retval none + */ +#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) do { \ + /* Clear FLASH_FLAG_OPTVERR flag */ \ + if ((__FLAG__) == FLASH_FLAG_OPTVERR) \ + { \ + CLEAR_BIT(FLASH->OBR, FLASH_OBR_OPTERR); \ + } \ + else { \ + /* Clear Flag in Bank1 */ \ + FLASH->SR = (__FLAG__); \ + } \ + } while(0U) + +#endif + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASHEx_Exported_Functions + * @{ + */ + +/** @addtogroup FLASHEx_Exported_Functions_Group1 + * @{ + */ +/* IO operation functions *****************************************************/ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError); +HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit); + +/** + * @} + */ + +/** @addtogroup FLASHEx_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ***********************************************/ +HAL_StatusTypeDef HAL_FLASHEx_OBErase(void); +HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit); +void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit); +uint32_t HAL_FLASHEx_OBGetUserData(uint32_t DATAAdress); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_FLASH_EX_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h new file mode 100644 index 0000000..469a2ea --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h @@ -0,0 +1,306 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO 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 STM32F1xx_HAL_GPIO_H +#define STM32F1xx_HAL_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_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 */ +} GPIO_InitTypeDef; + +/** + * @brief GPIO Bit SET and Bit RESET enumeration + */ +typedef enum +{ + GPIO_PIN_RESET = 0u, + 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: 0xX0yz00YZ + * - X : GPIO mode or EXTI Mode + * - y : External IT or Event trigger detection + * - z : IO configuration on External IT or Event + * - Y : Output type (Push Pull or Open Drain) + * - Z : IO Direction mode (Input, Output, Alternate or Analog) + * @{ + */ +#define GPIO_MODE_INPUT 0x00000000u /*!< Input Floating Mode */ +#define GPIO_MODE_OUTPUT_PP 0x00000001u /*!< Output Push Pull Mode */ +#define GPIO_MODE_OUTPUT_OD 0x00000011u /*!< Output Open Drain Mode */ +#define GPIO_MODE_AF_PP 0x00000002u /*!< Alternate Function Push Pull Mode */ +#define GPIO_MODE_AF_OD 0x00000012u /*!< Alternate Function Open Drain Mode */ +#define GPIO_MODE_AF_INPUT GPIO_MODE_INPUT /*!< Alternate Function Input Mode */ + +#define GPIO_MODE_ANALOG 0x00000003u /*!< Analog Mode */ + +#define GPIO_MODE_IT_RISING 0x10110000u /*!< External Interrupt Mode with Rising edge trigger detection */ +#define GPIO_MODE_IT_FALLING 0x10210000u /*!< External Interrupt Mode with Falling edge trigger detection */ +#define GPIO_MODE_IT_RISING_FALLING 0x10310000u /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ + +#define GPIO_MODE_EVT_RISING 0x10120000u /*!< External Event Mode with Rising edge trigger detection */ +#define GPIO_MODE_EVT_FALLING 0x10220000u /*!< External Event Mode with Falling edge trigger detection */ +#define GPIO_MODE_EVT_RISING_FALLING 0x10320000u /*!< 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 (GPIO_CRL_MODE0_1) /*!< Low speed */ +#define GPIO_SPEED_FREQ_MEDIUM (GPIO_CRL_MODE0_0) /*!< Medium speed */ +#define GPIO_SPEED_FREQ_HIGH (GPIO_CRL_MODE0) /*!< High speed */ + +/** + * @} + */ + +/** @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 "stm32f1xx_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 + * @{ + */ + +/** + * @} + */ + +/* 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)) +#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 /* STM32F1xx_HAL_GPIO_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h new file mode 100644 index 0000000..e61dc15 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h @@ -0,0 +1,892 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_gpio_ex.h + * @author MCD Application Team + * @brief Header file of GPIO 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 STM32F1xx_HAL_GPIO_EX_H +#define STM32F1xx_HAL_GPIO_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIOEx GPIOEx + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup GPIOEx_Exported_Constants GPIOEx Exported Constants + * @{ + */ + +/** @defgroup GPIOEx_EVENTOUT EVENTOUT Cortex Configuration + * @brief This section propose definition to use the Cortex EVENTOUT signal. + * @{ + */ + +/** @defgroup GPIOEx_EVENTOUT_PIN EVENTOUT Pin + * @{ + */ + +#define AFIO_EVENTOUT_PIN_0 AFIO_EVCR_PIN_PX0 /*!< EVENTOUT on pin 0 */ +#define AFIO_EVENTOUT_PIN_1 AFIO_EVCR_PIN_PX1 /*!< EVENTOUT on pin 1 */ +#define AFIO_EVENTOUT_PIN_2 AFIO_EVCR_PIN_PX2 /*!< EVENTOUT on pin 2 */ +#define AFIO_EVENTOUT_PIN_3 AFIO_EVCR_PIN_PX3 /*!< EVENTOUT on pin 3 */ +#define AFIO_EVENTOUT_PIN_4 AFIO_EVCR_PIN_PX4 /*!< EVENTOUT on pin 4 */ +#define AFIO_EVENTOUT_PIN_5 AFIO_EVCR_PIN_PX5 /*!< EVENTOUT on pin 5 */ +#define AFIO_EVENTOUT_PIN_6 AFIO_EVCR_PIN_PX6 /*!< EVENTOUT on pin 6 */ +#define AFIO_EVENTOUT_PIN_7 AFIO_EVCR_PIN_PX7 /*!< EVENTOUT on pin 7 */ +#define AFIO_EVENTOUT_PIN_8 AFIO_EVCR_PIN_PX8 /*!< EVENTOUT on pin 8 */ +#define AFIO_EVENTOUT_PIN_9 AFIO_EVCR_PIN_PX9 /*!< EVENTOUT on pin 9 */ +#define AFIO_EVENTOUT_PIN_10 AFIO_EVCR_PIN_PX10 /*!< EVENTOUT on pin 10 */ +#define AFIO_EVENTOUT_PIN_11 AFIO_EVCR_PIN_PX11 /*!< EVENTOUT on pin 11 */ +#define AFIO_EVENTOUT_PIN_12 AFIO_EVCR_PIN_PX12 /*!< EVENTOUT on pin 12 */ +#define AFIO_EVENTOUT_PIN_13 AFIO_EVCR_PIN_PX13 /*!< EVENTOUT on pin 13 */ +#define AFIO_EVENTOUT_PIN_14 AFIO_EVCR_PIN_PX14 /*!< EVENTOUT on pin 14 */ +#define AFIO_EVENTOUT_PIN_15 AFIO_EVCR_PIN_PX15 /*!< EVENTOUT on pin 15 */ + +#define IS_AFIO_EVENTOUT_PIN(__PIN__) (((__PIN__) == AFIO_EVENTOUT_PIN_0) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_1) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_2) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_3) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_4) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_5) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_6) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_7) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_8) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_9) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_10) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_11) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_12) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_13) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_14) || \ + ((__PIN__) == AFIO_EVENTOUT_PIN_15)) +/** + * @} + */ + +/** @defgroup GPIOEx_EVENTOUT_PORT EVENTOUT Port + * @{ + */ + +#define AFIO_EVENTOUT_PORT_A AFIO_EVCR_PORT_PA /*!< EVENTOUT on port A */ +#define AFIO_EVENTOUT_PORT_B AFIO_EVCR_PORT_PB /*!< EVENTOUT on port B */ +#define AFIO_EVENTOUT_PORT_C AFIO_EVCR_PORT_PC /*!< EVENTOUT on port C */ +#define AFIO_EVENTOUT_PORT_D AFIO_EVCR_PORT_PD /*!< EVENTOUT on port D */ +#define AFIO_EVENTOUT_PORT_E AFIO_EVCR_PORT_PE /*!< EVENTOUT on port E */ + +#define IS_AFIO_EVENTOUT_PORT(__PORT__) (((__PORT__) == AFIO_EVENTOUT_PORT_A) || \ + ((__PORT__) == AFIO_EVENTOUT_PORT_B) || \ + ((__PORT__) == AFIO_EVENTOUT_PORT_C) || \ + ((__PORT__) == AFIO_EVENTOUT_PORT_D) || \ + ((__PORT__) == AFIO_EVENTOUT_PORT_E)) +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup GPIOEx_AFIO_AF_REMAPPING Alternate Function Remapping + * @brief This section propose definition to remap the alternate function to some other port/pins. + * @{ + */ + +/** + * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI. + * @note ENABLE: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5) + * @retval None + */ +#define __HAL_AFIO_REMAP_SPI1_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_SPI1_REMAP) + +/** + * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI. + * @note DISABLE: No remap (NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7) + * @retval None + */ +#define __HAL_AFIO_REMAP_SPI1_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_SPI1_REMAP) + +/** + * @brief Enable the remapping of I2C1 alternate function SCL and SDA. + * @note ENABLE: Remap (SCL/PB8, SDA/PB9) + * @retval None + */ +#define __HAL_AFIO_REMAP_I2C1_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_I2C1_REMAP) + +/** + * @brief Disable the remapping of I2C1 alternate function SCL and SDA. + * @note DISABLE: No remap (SCL/PB6, SDA/PB7) + * @retval None + */ +#define __HAL_AFIO_REMAP_I2C1_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_I2C1_REMAP) + +/** + * @brief Enable the remapping of USART1 alternate function TX and RX. + * @note ENABLE: Remap (TX/PB6, RX/PB7) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART1_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_USART1_REMAP) + +/** + * @brief Disable the remapping of USART1 alternate function TX and RX. + * @note DISABLE: No remap (TX/PA9, RX/PA10) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART1_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_USART1_REMAP) + +/** + * @brief Enable the remapping of USART2 alternate function CTS, RTS, CK, TX and RX. + * @note ENABLE: Remap (CTS/PD3, RTS/PD4, TX/PD5, RX/PD6, CK/PD7) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART2_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_USART2_REMAP) + +/** + * @brief Disable the remapping of USART2 alternate function CTS, RTS, CK, TX and RX. + * @note DISABLE: No remap (CTS/PA0, RTS/PA1, TX/PA2, RX/PA3, CK/PA4) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART2_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_USART2_REMAP) + +/** + * @brief Enable the remapping of USART3 alternate function CTS, RTS, CK, TX and RX. + * @note ENABLE: Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART3_ENABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_USART3_REMAP_FULLREMAP, AFIO_MAPR_USART3_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of USART3 alternate function CTS, RTS, CK, TX and RX. + * @note PARTIAL: Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART3_PARTIAL() AFIO_REMAP_PARTIAL(AFIO_MAPR_USART3_REMAP_PARTIALREMAP, AFIO_MAPR_USART3_REMAP_FULLREMAP) + +/** + * @brief Disable the remapping of USART3 alternate function CTS, RTS, CK, TX and RX. + * @note DISABLE: No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) + * @retval None + */ +#define __HAL_AFIO_REMAP_USART3_DISABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_USART3_REMAP_NOREMAP, AFIO_MAPR_USART3_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM1 alternate function channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) + * @note ENABLE: Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM1_ENABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM1_REMAP_FULLREMAP, AFIO_MAPR_TIM1_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM1 alternate function channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) + * @note PARTIAL: Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM1_PARTIAL() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM1_REMAP_PARTIALREMAP, AFIO_MAPR_TIM1_REMAP_FULLREMAP) + +/** + * @brief Disable the remapping of TIM1 alternate function channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) + * @note DISABLE: No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM1_DISABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM1_REMAP_NOREMAP, AFIO_MAPR_TIM1_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @note ENABLE: Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM2_ENABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM2_REMAP_FULLREMAP, AFIO_MAPR_TIM2_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @note PARTIAL_2: Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM2_PARTIAL_2() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2, AFIO_MAPR_TIM2_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @note PARTIAL_1: Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM2_PARTIAL_1() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1, AFIO_MAPR_TIM2_REMAP_FULLREMAP) + +/** + * @brief Disable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @note DISABLE: No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM2_DISABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM2_REMAP_NOREMAP, AFIO_MAPR_TIM2_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM3 alternate function channels 1 to 4 + * @note ENABLE: Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) + * @note TIM3_ETR on PE0 is not re-mapped. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM3_ENABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_FULLREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM3 alternate function channels 1 to 4 + * @note PARTIAL: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) + * @note TIM3_ETR on PE0 is not re-mapped. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM3_PARTIAL() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_PARTIALREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP) + +/** + * @brief Disable the remapping of TIM3 alternate function channels 1 to 4 + * @note DISABLE: No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) + * @note TIM3_ETR on PE0 is not re-mapped. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM3_DISABLE() AFIO_REMAP_PARTIAL(AFIO_MAPR_TIM3_REMAP_NOREMAP, AFIO_MAPR_TIM3_REMAP_FULLREMAP) + +/** + * @brief Enable the remapping of TIM4 alternate function channels 1 to 4. + * @note ENABLE: Full remap (TIM4_CH1/PD12, TIM4_CH2/PD13, TIM4_CH3/PD14, TIM4_CH4/PD15) + * @note TIM4_ETR on PE0 is not re-mapped. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM4_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_TIM4_REMAP) + +/** + * @brief Disable the remapping of TIM4 alternate function channels 1 to 4. + * @note DISABLE: No remap (TIM4_CH1/PB6, TIM4_CH2/PB7, TIM4_CH3/PB8, TIM4_CH4/PB9) + * @note TIM4_ETR on PE0 is not re-mapped. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM4_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_TIM4_REMAP) + +#if defined(AFIO_MAPR_CAN_REMAP_REMAP1) + +/** + * @brief Enable or disable the remapping of CAN alternate function CAN_RX and CAN_TX in devices with a single CAN interface. + * @note CASE 1: CAN_RX mapped to PA11, CAN_TX mapped to PA12 + * @retval None + */ +#define __HAL_AFIO_REMAP_CAN1_1() AFIO_REMAP_PARTIAL(AFIO_MAPR_CAN_REMAP_REMAP1, AFIO_MAPR_CAN_REMAP) + +/** + * @brief Enable or disable the remapping of CAN alternate function CAN_RX and CAN_TX in devices with a single CAN interface. + * @note CASE 2: CAN_RX mapped to PB8, CAN_TX mapped to PB9 (not available on 36-pin package) + * @retval None + */ +#define __HAL_AFIO_REMAP_CAN1_2() AFIO_REMAP_PARTIAL(AFIO_MAPR_CAN_REMAP_REMAP2, AFIO_MAPR_CAN_REMAP) + +/** + * @brief Enable or disable the remapping of CAN alternate function CAN_RX and CAN_TX in devices with a single CAN interface. + * @note CASE 3: CAN_RX mapped to PD0, CAN_TX mapped to PD1 + * @retval None + */ +#define __HAL_AFIO_REMAP_CAN1_3() AFIO_REMAP_PARTIAL(AFIO_MAPR_CAN_REMAP_REMAP3, AFIO_MAPR_CAN_REMAP) + +#endif + +/** + * @brief Enable the remapping of PD0 and PD1. When the HSE oscillator is not used + * (application running on internal 8 MHz RC) PD0 and PD1 can be mapped on OSC_IN and + * OSC_OUT. This is available only on 36, 48 and 64 pins packages (PD0 and PD1 are available + * on 100-pin and 144-pin packages, no need for remapping). + * @note ENABLE: PD0 remapped on OSC_IN, PD1 remapped on OSC_OUT. + * @retval None + */ +#define __HAL_AFIO_REMAP_PD01_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_PD01_REMAP) + +/** + * @brief Disable the remapping of PD0 and PD1. When the HSE oscillator is not used + * (application running on internal 8 MHz RC) PD0 and PD1 can be mapped on OSC_IN and + * OSC_OUT. This is available only on 36, 48 and 64 pins packages (PD0 and PD1 are available + * on 100-pin and 144-pin packages, no need for remapping). + * @note DISABLE: No remapping of PD0 and PD1 + * @retval None + */ +#define __HAL_AFIO_REMAP_PD01_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_PD01_REMAP) + +#if defined(AFIO_MAPR_TIM5CH4_IREMAP) +/** + * @brief Enable the remapping of TIM5CH4. + * @note ENABLE: LSI internal clock is connected to TIM5_CH4 input for calibration purpose. + * @note This function is available only in high density value line devices. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM5CH4_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_TIM5CH4_IREMAP) + +/** + * @brief Disable the remapping of TIM5CH4. + * @note DISABLE: TIM5_CH4 is connected to PA3 + * @note This function is available only in high density value line devices. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM5CH4_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_TIM5CH4_IREMAP) +#endif + +#if defined(AFIO_MAPR_ETH_REMAP) +/** + * @brief Enable the remapping of Ethernet MAC connections with the PHY. + * @note ENABLE: Remap (RX_DV-CRS_DV/PD8, RXD0/PD9, RXD1/PD10, RXD2/PD11, RXD3/PD12) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_REMAP_ETH_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_ETH_REMAP) + +/** + * @brief Disable the remapping of Ethernet MAC connections with the PHY. + * @note DISABLE: No remap (RX_DV-CRS_DV/PA7, RXD0/PC4, RXD1/PC5, RXD2/PB0, RXD3/PB1) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_REMAP_ETH_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_ETH_REMAP) +#endif + +#if defined(AFIO_MAPR_CAN2_REMAP) + +/** + * @brief Enable the remapping of CAN2 alternate function CAN2_RX and CAN2_TX. + * @note ENABLE: Remap (CAN2_RX/PB5, CAN2_TX/PB6) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_REMAP_CAN2_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_CAN2_REMAP) + +/** + * @brief Disable the remapping of CAN2 alternate function CAN2_RX and CAN2_TX. + * @note DISABLE: No remap (CAN2_RX/PB12, CAN2_TX/PB13) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_REMAP_CAN2_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_CAN2_REMAP) +#endif + +#if defined(AFIO_MAPR_MII_RMII_SEL) +/** + * @brief Configures the Ethernet MAC internally for use with an external MII or RMII PHY. + * @note ETH_RMII: Configure Ethernet MAC for connection with an RMII PHY + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_ETH_RMII() AFIO_REMAP_ENABLE(AFIO_MAPR_MII_RMII_SEL) + +/** + * @brief Configures the Ethernet MAC internally for use with an external MII or RMII PHY. + * @note ETH_MII: Configure Ethernet MAC for connection with an MII PHY + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_ETH_MII() AFIO_REMAP_DISABLE(AFIO_MAPR_MII_RMII_SEL) +#endif + +/** + * @brief Enable the remapping of ADC1_ETRGINJ (ADC 1 External trigger injected conversion). + * @note ENABLE: ADC1 External Event injected conversion is connected to TIM8 Channel4. + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC1_ETRGINJ_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_ADC1_ETRGINJ_REMAP) + +/** + * @brief Disable the remapping of ADC1_ETRGINJ (ADC 1 External trigger injected conversion). + * @note DISABLE: ADC1 External trigger injected conversion is connected to EXTI15 + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC1_ETRGINJ_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_ADC1_ETRGINJ_REMAP) + +/** + * @brief Enable the remapping of ADC1_ETRGREG (ADC 1 External trigger regular conversion). + * @note ENABLE: ADC1 External Event regular conversion is connected to TIM8 TRG0. + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC1_ETRGREG_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_ADC1_ETRGREG_REMAP) + +/** + * @brief Disable the remapping of ADC1_ETRGREG (ADC 1 External trigger regular conversion). + * @note DISABLE: ADC1 External trigger regular conversion is connected to EXTI11 + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC1_ETRGREG_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_ADC1_ETRGREG_REMAP) + +#if defined(AFIO_MAPR_ADC2_ETRGINJ_REMAP) + +/** + * @brief Enable the remapping of ADC2_ETRGREG (ADC 2 External trigger injected conversion). + * @note ENABLE: ADC2 External Event injected conversion is connected to TIM8 Channel4. + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC2_ETRGINJ_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_ADC2_ETRGINJ_REMAP) + +/** + * @brief Disable the remapping of ADC2_ETRGREG (ADC 2 External trigger injected conversion). + * @note DISABLE: ADC2 External trigger injected conversion is connected to EXTI15 + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC2_ETRGINJ_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_ADC2_ETRGINJ_REMAP) +#endif + +#if defined (AFIO_MAPR_ADC2_ETRGREG_REMAP) + +/** + * @brief Enable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @note ENABLE: ADC2 External Event regular conversion is connected to TIM8 TRG0. + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC2_ETRGREG_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_ADC2_ETRGREG_REMAP) + +/** + * @brief Disable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @note DISABLE: ADC2 External trigger regular conversion is connected to EXTI11 + * @retval None + */ +#define __HAL_AFIO_REMAP_ADC2_ETRGREG_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_ADC2_ETRGREG_REMAP) +#endif + +/** + * @brief Enable the Serial wire JTAG configuration + * @note ENABLE: Full SWJ (JTAG-DP + SW-DP): Reset State + * @retval None + */ +#define __HAL_AFIO_REMAP_SWJ_ENABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_RESET) + +/** + * @brief Enable the Serial wire JTAG configuration + * @note NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST + * @retval None + */ +#define __HAL_AFIO_REMAP_SWJ_NONJTRST() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_NOJNTRST) + +/** + * @brief Enable the Serial wire JTAG configuration + * @note NOJTAG: JTAG-DP Disabled and SW-DP Enabled + * @retval None + */ + +#define __HAL_AFIO_REMAP_SWJ_NOJTAG() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_JTAGDISABLE) + +/** + * @brief Disable the Serial wire JTAG configuration + * @note DISABLE: JTAG-DP Disabled and SW-DP Disabled + * @retval None + */ +#define __HAL_AFIO_REMAP_SWJ_DISABLE() AFIO_DBGAFR_CONFIG(AFIO_MAPR_SWJ_CFG_DISABLE) + +#if defined(AFIO_MAPR_SPI3_REMAP) + +/** + * @brief Enable the remapping of SPI3 alternate functions SPI3_NSS/I2S3_WS, SPI3_SCK/I2S3_CK, SPI3_MISO, SPI3_MOSI/I2S3_SD. + * @note ENABLE: Remap (SPI3_NSS-I2S3_WS/PA4, SPI3_SCK-I2S3_CK/PC10, SPI3_MISO/PC11, SPI3_MOSI-I2S3_SD/PC12) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_REMAP_SPI3_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_SPI3_REMAP) + +/** + * @brief Disable the remapping of SPI3 alternate functions SPI3_NSS/I2S3_WS, SPI3_SCK/I2S3_CK, SPI3_MISO, SPI3_MOSI/I2S3_SD. + * @note DISABLE: No remap (SPI3_NSS-I2S3_WS/PA15, SPI3_SCK-I2S3_CK/PB3, SPI3_MISO/PB4, SPI3_MOSI-I2S3_SD/PB5). + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_REMAP_SPI3_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_SPI3_REMAP) +#endif + +#if defined(AFIO_MAPR_TIM2ITR1_IREMAP) + +/** + * @brief Control of TIM2_ITR1 internal mapping. + * @note TO_USB: Connect USB OTG SOF (Start of Frame) output to TIM2_ITR1 for calibration purposes. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_TIM2ITR1_TO_USB() AFIO_REMAP_ENABLE(AFIO_MAPR_TIM2ITR1_IREMAP) + +/** + * @brief Control of TIM2_ITR1 internal mapping. + * @note TO_ETH: Connect TIM2_ITR1 internally to the Ethernet PTP output for calibration purposes. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_TIM2ITR1_TO_ETH() AFIO_REMAP_DISABLE(AFIO_MAPR_TIM2ITR1_IREMAP) +#endif + +#if defined(AFIO_MAPR_PTP_PPS_REMAP) + +/** + * @brief Enable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @note ENABLE: PTP_PPS is output on PB5 pin. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_ETH_PTP_PPS_ENABLE() AFIO_REMAP_ENABLE(AFIO_MAPR_PTP_PPS_REMAP) + +/** + * @brief Disable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @note DISABLE: PTP_PPS not output on PB5 pin. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +#define __HAL_AFIO_ETH_PTP_PPS_DISABLE() AFIO_REMAP_DISABLE(AFIO_MAPR_PTP_PPS_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM9_REMAP) + +/** + * @brief Enable the remapping of TIM9_CH1 and TIM9_CH2. + * @note ENABLE: Remap (TIM9_CH1 on PE5 and TIM9_CH2 on PE6). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM9_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM9_REMAP) + +/** + * @brief Disable the remapping of TIM9_CH1 and TIM9_CH2. + * @note DISABLE: No remap (TIM9_CH1 on PA2 and TIM9_CH2 on PA3). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM9_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM9_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM10_REMAP) + +/** + * @brief Enable the remapping of TIM10_CH1. + * @note ENABLE: Remap (TIM10_CH1 on PF6). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM10_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM10_REMAP) + +/** + * @brief Disable the remapping of TIM10_CH1. + * @note DISABLE: No remap (TIM10_CH1 on PB8). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM10_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM10_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM11_REMAP) +/** + * @brief Enable the remapping of TIM11_CH1. + * @note ENABLE: Remap (TIM11_CH1 on PF7). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM11_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM11_REMAP) + +/** + * @brief Disable the remapping of TIM11_CH1. + * @note DISABLE: No remap (TIM11_CH1 on PB9). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM11_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM11_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM13_REMAP) + +/** + * @brief Enable the remapping of TIM13_CH1. + * @note ENABLE: Remap STM32F100:(TIM13_CH1 on PF8). Others:(TIM13_CH1 on PB0). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM13_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM13_REMAP) + +/** + * @brief Disable the remapping of TIM13_CH1. + * @note DISABLE: No remap STM32F100:(TIM13_CH1 on PA6). Others:(TIM13_CH1 on PC8). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM13_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM13_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM14_REMAP) + +/** + * @brief Enable the remapping of TIM14_CH1. + * @note ENABLE: Remap STM32F100:(TIM14_CH1 on PB1). Others:(TIM14_CH1 on PF9). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM14_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM14_REMAP) + +/** + * @brief Disable the remapping of TIM14_CH1. + * @note DISABLE: No remap STM32F100:(TIM14_CH1 on PC9). Others:(TIM14_CH1 on PA7). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM14_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM14_REMAP) +#endif + +#if defined(AFIO_MAPR2_FSMC_NADV_REMAP) + +/** + * @brief Controls the use of the optional FSMC_NADV signal. + * @note DISCONNECTED: The NADV signal is not connected. The I/O pin can be used by another peripheral. + * @retval None + */ +#define __HAL_AFIO_FSMCNADV_DISCONNECTED() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_FSMC_NADV_REMAP) + +/** + * @brief Controls the use of the optional FSMC_NADV signal. + * @note CONNECTED: The NADV signal is connected to the output (default). + * @retval None + */ +#define __HAL_AFIO_FSMCNADV_CONNECTED() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_FSMC_NADV_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM15_REMAP) + +/** + * @brief Enable the remapping of TIM15_CH1 and TIM15_CH2. + * @note ENABLE: Remap (TIM15_CH1 on PB14 and TIM15_CH2 on PB15). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM15_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM15_REMAP) + +/** + * @brief Disable the remapping of TIM15_CH1 and TIM15_CH2. + * @note DISABLE: No remap (TIM15_CH1 on PA2 and TIM15_CH2 on PA3). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM15_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM15_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM16_REMAP) + +/** + * @brief Enable the remapping of TIM16_CH1. + * @note ENABLE: Remap (TIM16_CH1 on PA6). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM16_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM16_REMAP) + +/** + * @brief Disable the remapping of TIM16_CH1. + * @note DISABLE: No remap (TIM16_CH1 on PB8). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM16_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM16_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM17_REMAP) + +/** + * @brief Enable the remapping of TIM17_CH1. + * @note ENABLE: Remap (TIM17_CH1 on PA7). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM17_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM17_REMAP) + +/** + * @brief Disable the remapping of TIM17_CH1. + * @note DISABLE: No remap (TIM17_CH1 on PB9). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM17_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM17_REMAP) +#endif + +#if defined(AFIO_MAPR2_CEC_REMAP) + +/** + * @brief Enable the remapping of CEC. + * @note ENABLE: Remap (CEC on PB10). + * @retval None + */ +#define __HAL_AFIO_REMAP_CEC_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_CEC_REMAP) + +/** + * @brief Disable the remapping of CEC. + * @note DISABLE: No remap (CEC on PB8). + * @retval None + */ +#define __HAL_AFIO_REMAP_CEC_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_CEC_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM1_DMA_REMAP) + +/** + * @brief Controls the mapping of the TIM1_CH1 TIM1_CH2 DMA requests onto the DMA1 channels. + * @note ENABLE: Remap (TIM1_CH1 DMA request/DMA1 Channel6, TIM1_CH2 DMA request/DMA1 Channel6) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM1DMA_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM1_DMA_REMAP) + +/** + * @brief Controls the mapping of the TIM1_CH1 TIM1_CH2 DMA requests onto the DMA1 channels. + * @note DISABLE: No remap (TIM1_CH1 DMA request/DMA1 Channel2, TIM1_CH2 DMA request/DMA1 Channel3). + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM1DMA_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM1_DMA_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM67_DAC_DMA_REMAP) + +/** + * @brief Controls the mapping of the TIM6_DAC1 and TIM7_DAC2 DMA requests onto the DMA1 channels. + * @note ENABLE: Remap (TIM6_DAC1 DMA request/DMA1 Channel3, TIM7_DAC2 DMA request/DMA1 Channel4) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM67DACDMA_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM67_DAC_DMA_REMAP) + +/** + * @brief Controls the mapping of the TIM6_DAC1 and TIM7_DAC2 DMA requests onto the DMA1 channels. + * @note DISABLE: No remap (TIM6_DAC1 DMA request/DMA2 Channel3, TIM7_DAC2 DMA request/DMA2 Channel4) + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM67DACDMA_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM67_DAC_DMA_REMAP) +#endif + +#if defined(AFIO_MAPR2_TIM12_REMAP) + +/** + * @brief Enable the remapping of TIM12_CH1 and TIM12_CH2. + * @note ENABLE: Remap (TIM12_CH1 on PB12 and TIM12_CH2 on PB13). + * @note This bit is available only in high density value line devices. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM12_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM12_REMAP) + +/** + * @brief Disable the remapping of TIM12_CH1 and TIM12_CH2. + * @note DISABLE: No remap (TIM12_CH1 on PC4 and TIM12_CH2 on PC5). + * @note This bit is available only in high density value line devices. + * @retval None + */ +#define __HAL_AFIO_REMAP_TIM12_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM12_REMAP) +#endif + +#if defined(AFIO_MAPR2_MISC_REMAP) + +/** + * @brief Miscellaneous features remapping. + * This bit is set and cleared by software. It controls miscellaneous features. + * The DMA2 channel 5 interrupt position in the vector table. + * The timer selection for DAC trigger 3 (TSEL[2:0] = 011, for more details refer to the DAC_CR register). + * @note ENABLE: DMA2 channel 5 interrupt is mapped separately at position 60 and TIM15 TRGO event is + * selected as DAC Trigger 3, TIM15 triggers TIM1/3. + * @note This bit is available only in high density value line devices. + * @retval None + */ +#define __HAL_AFIO_REMAP_MISC_ENABLE() SET_BIT(AFIO->MAPR2, AFIO_MAPR2_MISC_REMAP) + +/** + * @brief Miscellaneous features remapping. + * This bit is set and cleared by software. It controls miscellaneous features. + * The DMA2 channel 5 interrupt position in the vector table. + * The timer selection for DAC trigger 3 (TSEL[2:0] = 011, for more details refer to the DAC_CR register). + * @note DISABLE: DMA2 channel 5 interrupt is mapped with DMA2 channel 4 at position 59, TIM5 TRGO + * event is selected as DAC Trigger 3, TIM5 triggers TIM1/3. + * @note This bit is available only in high density value line devices. + * @retval None + */ +#define __HAL_AFIO_REMAP_MISC_DISABLE() CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_MISC_REMAP) +#endif + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup GPIOEx_Private_Macros GPIOEx Private Macros + * @{ + */ +#if defined(STM32F101x6) || defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6) +#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIOA))? 0uL :\ + ((__GPIOx__) == (GPIOB))? 1uL :\ + ((__GPIOx__) == (GPIOC))? 2uL :3uL) +#elif defined(STM32F100xB) || defined(STM32F101xB) || defined(STM32F103xB) || defined(STM32F105xC) || defined(STM32F107xC) +#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIOA))? 0uL :\ + ((__GPIOx__) == (GPIOB))? 1uL :\ + ((__GPIOx__) == (GPIOC))? 2uL :\ + ((__GPIOx__) == (GPIOD))? 3uL :4uL) +#elif defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIOA))? 0uL :\ + ((__GPIOx__) == (GPIOB))? 1uL :\ + ((__GPIOx__) == (GPIOC))? 2uL :\ + ((__GPIOx__) == (GPIOD))? 3uL :\ + ((__GPIOx__) == (GPIOE))? 4uL :\ + ((__GPIOx__) == (GPIOF))? 5uL :6uL) +#endif + +#define AFIO_REMAP_ENABLE(REMAP_PIN) do{ uint32_t tmpreg = AFIO->MAPR; \ + tmpreg |= AFIO_MAPR_SWJ_CFG; \ + tmpreg |= REMAP_PIN; \ + AFIO->MAPR = tmpreg; \ + }while(0u) + +#define AFIO_REMAP_DISABLE(REMAP_PIN) do{ uint32_t tmpreg = AFIO->MAPR; \ + tmpreg |= AFIO_MAPR_SWJ_CFG; \ + tmpreg &= ~REMAP_PIN; \ + AFIO->MAPR = tmpreg; \ + }while(0u) + +#define AFIO_REMAP_PARTIAL(REMAP_PIN, REMAP_PIN_MASK) do{ uint32_t tmpreg = AFIO->MAPR; \ + tmpreg &= ~REMAP_PIN_MASK; \ + tmpreg |= AFIO_MAPR_SWJ_CFG; \ + tmpreg |= REMAP_PIN; \ + AFIO->MAPR = tmpreg; \ + }while(0u) + +#define AFIO_DBGAFR_CONFIG(DBGAFR_SWJCFG) do{ uint32_t tmpreg = AFIO->MAPR; \ + tmpreg &= ~AFIO_MAPR_SWJ_CFG_Msk; \ + tmpreg |= DBGAFR_SWJCFG; \ + AFIO->MAPR = tmpreg; \ + }while(0u) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup GPIOEx_Exported_Functions + * @{ + */ + +/** @addtogroup GPIOEx_Exported_Functions_Group1 + * @{ + */ +void HAL_GPIOEx_ConfigEventout(uint32_t GPIO_PortSource, uint32_t GPIO_PinSource); +void HAL_GPIOEx_EnableEventout(void); +void HAL_GPIOEx_DisableEventout(void); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F1xx_HAL_GPIO_EX_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd.h new file mode 100644 index 0000000..881ba2f --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd.h @@ -0,0 +1,1055 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_pcd.h + * @author MCD Application Team + * @brief Header file of PCD 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 STM32F1xx_HAL_PCD_H +#define STM32F1xx_HAL_PCD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_ll_usb.h" + +#if defined (USB) || defined (USB_OTG_FS) + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup PCD + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup PCD_Exported_Types PCD Exported Types + * @{ + */ + +/** + * @brief PCD State structure definition + */ +typedef enum +{ + HAL_PCD_STATE_RESET = 0x00, + HAL_PCD_STATE_READY = 0x01, + HAL_PCD_STATE_ERROR = 0x02, + HAL_PCD_STATE_BUSY = 0x03, + HAL_PCD_STATE_TIMEOUT = 0x04 +} PCD_StateTypeDef; + +/* Device LPM suspend state */ +typedef enum +{ + LPM_L0 = 0x00, /* on */ + LPM_L1 = 0x01, /* LPM L1 sleep */ + LPM_L2 = 0x02, /* suspend */ + LPM_L3 = 0x03, /* off */ +} PCD_LPM_StateTypeDef; + +typedef enum +{ + PCD_LPM_L0_ACTIVE = 0x00, /* on */ + PCD_LPM_L1_ACTIVE = 0x01, /* LPM L1 sleep */ +} PCD_LPM_MsgTypeDef; + +typedef enum +{ + PCD_BCD_ERROR = 0xFF, + PCD_BCD_CONTACT_DETECTION = 0xFE, + PCD_BCD_STD_DOWNSTREAM_PORT = 0xFD, + PCD_BCD_CHARGING_DOWNSTREAM_PORT = 0xFC, + PCD_BCD_DEDICATED_CHARGING_PORT = 0xFB, + PCD_BCD_DISCOVERY_COMPLETED = 0x00, + +} PCD_BCD_MsgTypeDef; + +#if defined (USB) + +#endif /* defined (USB) */ +#if defined (USB_OTG_FS) +typedef USB_OTG_GlobalTypeDef PCD_TypeDef; +typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; +typedef USB_OTG_EPTypeDef PCD_EPTypeDef; +#endif /* defined (USB_OTG_FS) */ +#if defined (USB) +typedef USB_TypeDef PCD_TypeDef; +typedef USB_CfgTypeDef PCD_InitTypeDef; +typedef USB_EPTypeDef PCD_EPTypeDef; +#endif /* defined (USB) */ + +/** + * @brief PCD Handle Structure definition + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +typedef struct __PCD_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + PCD_TypeDef *Instance; /*!< Register base address */ + PCD_InitTypeDef Init; /*!< PCD required parameters */ + __IO uint8_t USB_Address; /*!< USB Address */ +#if defined (USB_OTG_FS) + PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ +#endif /* defined (USB_OTG_FS) */ +#if defined (USB) + PCD_EPTypeDef IN_ep[8]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[8]; /*!< OUT endpoint parameters */ +#endif /* defined (USB) */ + HAL_LockTypeDef Lock; /*!< PCD peripheral status */ + __IO PCD_StateTypeDef State; /*!< PCD communication state */ + __IO uint32_t ErrorCode; /*!< PCD Error code */ + uint32_t Setup[12]; /*!< Setup packet buffer */ + PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ + uint32_t BESL; + uint32_t FrameNumber; /*!< Store Current Frame number */ + + void *pData; /*!< Pointer to upper stack Handler */ + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + void (* SOFCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD SOF callback */ + void (* SetupStageCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Setup Stage callback */ + void (* ResetCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Reset callback */ + void (* SuspendCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Suspend callback */ + void (* ResumeCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Resume callback */ + void (* ConnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Connect callback */ + void (* DisconnectCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Disconnect callback */ + + void (* DataOutStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data OUT Stage callback */ + void (* DataInStageCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD Data IN Stage callback */ + void (* ISOOUTIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO OUT Incomplete callback */ + void (* ISOINIncompleteCallback)(struct __PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< USB OTG PCD ISO IN Incomplete callback */ + + void (* MspInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp Init callback */ + void (* MspDeInitCallback)(struct __PCD_HandleTypeDef *hpcd); /*!< USB OTG PCD Msp DeInit callback */ +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +} PCD_HandleTypeDef; + +/** + * @} + */ + +/* Include PCD HAL Extended module */ +#include "stm32f1xx_hal_pcd_ex.h" + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PCD_Exported_Constants PCD Exported Constants + * @{ + */ + +/** @defgroup PCD_Speed PCD Speed + * @{ + */ +#define PCD_SPEED_FULL USBD_FS_SPEED +/** + * @} + */ + +/** @defgroup PCD_PHY_Module PCD PHY Module + * @{ + */ +#define PCD_PHY_ULPI 1U +#define PCD_PHY_EMBEDDED 2U +#define PCD_PHY_UTMI 3U +/** + * @} + */ + +/** @defgroup PCD_Error_Code_definition PCD Error Code definition + * @brief PCD Error Code definition + * @{ + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +#define HAL_PCD_ERROR_INVALID_CALLBACK (0x00000010U) /*!< Invalid Callback error */ +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup PCD_Exported_Macros PCD Exported Macros + * @brief macros to handle interrupts and specific clock configurations + * @{ + */ +#define __HAL_PCD_ENABLE(__HANDLE__) (void)USB_EnableGlobalInt ((__HANDLE__)->Instance) +#define __HAL_PCD_DISABLE(__HANDLE__) (void)USB_DisableGlobalInt ((__HANDLE__)->Instance) + +#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) \ + ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) + +#if defined (USB_OTG_FS) +#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) &= (__INTERRUPT__)) +#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0U) + +#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) \ + *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= ~(USB_OTG_PCGCCTL_STOPCLK) + +#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) \ + *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK + +#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) \ + ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE)) & 0x10U) + +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE + +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ + EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ + EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ + } while(0U) +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->ISTR)\ + &= (uint16_t)(~(__INTERRUPT__))) + +#define __HAL_USB_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_WAKEUP_EXTI_LINE +#define __HAL_USB_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_WAKEUP_EXTI_LINE) +#define __HAL_USB_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_WAKEUP_EXTI_LINE) +#define __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_WAKEUP_EXTI_LINE + +#define __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ + EXTI->FTSR &= ~(USB_WAKEUP_EXTI_LINE); \ + EXTI->RTSR |= USB_WAKEUP_EXTI_LINE; \ + } while(0U) + +#endif /* defined (USB) */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PCD_Exported_Functions PCD Exported Functions + * @{ + */ + +/* Initialization/de-initialization functions ********************************/ +/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); +void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); +void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +/** @defgroup HAL_PCD_Callback_ID_enumeration_definition HAL USB OTG PCD Callback ID enumeration definition + * @brief HAL USB OTG PCD Callback ID enumeration definition + * @{ + */ +typedef enum +{ + HAL_PCD_SOF_CB_ID = 0x01, /*!< USB PCD SOF callback ID */ + HAL_PCD_SETUPSTAGE_CB_ID = 0x02, /*!< USB PCD Setup Stage callback ID */ + HAL_PCD_RESET_CB_ID = 0x03, /*!< USB PCD Reset callback ID */ + HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ + HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ + HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ + HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ + + HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ + HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ + +} HAL_PCD_CallbackIDTypeDef; +/** + * @} + */ + +/** @defgroup HAL_PCD_Callback_pointer_definition HAL USB OTG PCD Callback pointer definition + * @brief HAL USB OTG PCD Callback pointer definition + * @{ + */ + +typedef void (*pPCD_CallbackTypeDef)(PCD_HandleTypeDef *hpcd); /*!< pointer to a common USB OTG PCD callback function */ +typedef void (*pPCD_DataOutStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data OUT Stage callback */ +typedef void (*pPCD_DataInStageCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD Data IN Stage callback */ +typedef void (*pPCD_IsoOutIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO OUT Incomplete callback */ +typedef void (*pPCD_IsoInIncpltCallbackTypeDef)(PCD_HandleTypeDef *hpcd, uint8_t epnum); /*!< pointer to USB OTG PCD ISO IN Incomplete callback */ + +/** + * @} + */ + +HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID, + pPCD_CallbackTypeDef pCallback); + +HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID); + +HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, + pPCD_DataOutStageCallbackTypeDef pCallback); + +HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, + pPCD_DataInStageCallbackTypeDef pCallback); + +HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, + pPCD_IsoOutIncpltCallbackTypeDef pCallback); + +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd); + +HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, + pPCD_IsoInIncpltCallbackTypeDef pCallback); + +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd); + +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +/** + * @} + */ + +/* I/O operation functions ***************************************************/ +/* Non-Blocking mode: Interrupt */ +/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions + * @{ + */ +HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); +void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); +void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd); + +void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); + +void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); +/** + * @} + */ + +/* Peripheral Control functions **********************************************/ +/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions + * @{ + */ +HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); +HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); +HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); +HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); +HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); +HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); +HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); +uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr); +/** + * @} + */ + +/* Peripheral State functions ************************************************/ +/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions + * @{ + */ +PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd); +/** + * @} + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PCD_Private_Constants PCD Private Constants + * @{ + */ +/** @defgroup USB_EXTI_Line_Interrupt USB EXTI line interrupt + * @{ + */ +#if defined (USB_OTG_FS) +#define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +#define USB_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ +#endif /* defined (USB) */ + +/** + * @} + */ +#if defined (USB) +/** @defgroup PCD_EP0_MPS PCD EP0 MPS + * @{ + */ +#define PCD_EP0MPS_64 EP_MPS_64 +#define PCD_EP0MPS_32 EP_MPS_32 +#define PCD_EP0MPS_16 EP_MPS_16 +#define PCD_EP0MPS_08 EP_MPS_8 +/** + * @} + */ + +/** @defgroup PCD_ENDP PCD ENDP + * @{ + */ +#define PCD_ENDP0 0U +#define PCD_ENDP1 1U +#define PCD_ENDP2 2U +#define PCD_ENDP3 3U +#define PCD_ENDP4 4U +#define PCD_ENDP5 5U +#define PCD_ENDP6 6U +#define PCD_ENDP7 7U +/** + * @} + */ + +/** @defgroup PCD_ENDP_Kind PCD Endpoint Kind + * @{ + */ +#define PCD_SNG_BUF 0U +#define PCD_DBL_BUF 1U +/** + * @} + */ +#endif /* defined (USB) */ +/** + * @} + */ + +#if defined (USB_OTG_FS) +#ifndef USB_OTG_DOEPINT_OTEPSPR +#define USB_OTG_DOEPINT_OTEPSPR (0x1UL << 5) /*!< Status Phase Received interrupt */ +#endif /* defined USB_OTG_DOEPINT_OTEPSPR */ + +#ifndef USB_OTG_DOEPMSK_OTEPSPRM +#define USB_OTG_DOEPMSK_OTEPSPRM (0x1UL << 5) /*!< Setup Packet Received interrupt mask */ +#endif /* defined USB_OTG_DOEPMSK_OTEPSPRM */ + +#ifndef USB_OTG_DOEPINT_NAK +#define USB_OTG_DOEPINT_NAK (0x1UL << 13) /*!< NAK interrupt */ +#endif /* defined USB_OTG_DOEPINT_NAK */ + +#ifndef USB_OTG_DOEPMSK_NAKM +#define USB_OTG_DOEPMSK_NAKM (0x1UL << 13) /*!< OUT Packet NAK interrupt mask */ +#endif /* defined USB_OTG_DOEPMSK_NAKM */ + +#ifndef USB_OTG_DOEPINT_STPKTRX +#define USB_OTG_DOEPINT_STPKTRX (0x1UL << 15) /*!< Setup Packet Received interrupt */ +#endif /* defined USB_OTG_DOEPINT_STPKTRX */ + +#ifndef USB_OTG_DOEPMSK_NYETM +#define USB_OTG_DOEPMSK_NYETM (0x1UL << 14) /*!< Setup Packet Received interrupt mask */ +#endif /* defined USB_OTG_DOEPMSK_NYETM */ +#endif /* defined (USB_OTG_FS) */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PCD_Private_Macros PCD Private Macros + * @{ + */ +#if defined (USB) +/******************** Bit definition for USB_COUNTn_RX register *************/ +#define USB_CNTRX_NBLK_MSK (0x1FU << 10) +#define USB_CNTRX_BLSIZE (0x1U << 15) + +/* SetENDPOINT */ +#define PCD_SET_ENDPOINT(USBx, bEpNum, wRegValue) \ + (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U)) = (uint16_t)(wRegValue)) + +/* GetENDPOINT */ +#define PCD_GET_ENDPOINT(USBx, bEpNum) (*(__IO uint16_t *)(&(USBx)->EP0R + ((bEpNum) * 2U))) + + +/** + * @brief sets the type in the endpoint register(bits EP_TYPE[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wType Endpoint Type. + * @retval None + */ +#define PCD_SET_EPTYPE(USBx, bEpNum, wType) \ + (PCD_SET_ENDPOINT((USBx), (bEpNum), \ + ((PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_MASK) | (wType) | USB_EP_CTR_TX | USB_EP_CTR_RX))) + + +/** + * @brief gets the type in the endpoint register(bits EP_TYPE[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval Endpoint Type + */ +#define PCD_GET_EPTYPE(USBx, bEpNum) (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EP_T_FIELD) + +/** + * @brief free buffer used from the application realizing it to the line + * toggles bit SW_BUF in the double buffered endpoint register + * @param USBx USB device. + * @param bEpNum, bDir + * @retval None + */ +#define PCD_FREE_USER_BUFFER(USBx, bEpNum, bDir) \ + do { \ + if ((bDir) == 0U) \ + { \ + /* OUT double buffered endpoint */ \ + PCD_TX_DTOG((USBx), (bEpNum)); \ + } \ + else if ((bDir) == 1U) \ + { \ + /* IN double buffered endpoint */ \ + PCD_RX_DTOG((USBx), (bEpNum)); \ + } \ + } while(0) + +/** + * @brief sets the status for tx transfer (bits STAT_TX[1:0]). + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wState new state + * @retval None + */ +#define PCD_SET_EP_TX_STATUS(USBx, bEpNum, wState) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_DTOGMASK; \ + /* toggle first bit ? */ \ + if ((USB_EPTX_DTOG1 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPTX_DTOG2 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG2; \ + } \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_TX_STATUS */ + +/** + * @brief sets the status for rx transfer (bits STAT_TX[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wState new state + * @retval None + */ +#define PCD_SET_EP_RX_STATUS(USBx, bEpNum,wState) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_DTOGMASK; \ + /* toggle first bit ? */ \ + if ((USB_EPRX_DTOG1 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPRX_DTOG2 & (wState))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG2; \ + } \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_RX_STATUS */ + +/** + * @brief sets the status for rx & tx (bits STAT_TX[1:0] & STAT_RX[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wStaterx new state. + * @param wStatetx new state. + * @retval None + */ +#define PCD_SET_EP_TXRX_STATUS(USBx, bEpNum, wStaterx, wStatetx) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (USB_EPRX_DTOGMASK | USB_EPTX_STAT); \ + /* toggle first bit ? */ \ + if ((USB_EPRX_DTOG1 & (wStaterx))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPRX_DTOG2 & (wStaterx))!= 0U) \ + { \ + _wRegVal ^= USB_EPRX_DTOG2; \ + } \ + /* toggle first bit ? */ \ + if ((USB_EPTX_DTOG1 & (wStatetx))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG1; \ + } \ + /* toggle second bit ? */ \ + if ((USB_EPTX_DTOG2 & (wStatetx))!= 0U) \ + { \ + _wRegVal ^= USB_EPTX_DTOG2; \ + } \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_TXRX_STATUS */ + +/** + * @brief gets the status for tx/rx transfer (bits STAT_TX[1:0] + * /STAT_RX[1:0]) + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval status + */ +#define PCD_GET_EP_TX_STATUS(USBx, bEpNum) ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPTX_STAT) +#define PCD_GET_EP_RX_STATUS(USBx, bEpNum) ((uint16_t)PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPRX_STAT) + +/** + * @brief sets directly the VALID tx/rx-status into the endpoint register + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_EP_TX_VALID(USBx, bEpNum) (PCD_SET_EP_TX_STATUS((USBx), (bEpNum), USB_EP_TX_VALID)) +#define PCD_SET_EP_RX_VALID(USBx, bEpNum) (PCD_SET_EP_RX_STATUS((USBx), (bEpNum), USB_EP_RX_VALID)) + +/** + * @brief checks stall condition in an endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval TRUE = endpoint in stall condition. + */ +#define PCD_GET_EP_TX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_TX_STATUS((USBx), (bEpNum)) == USB_EP_TX_STALL) +#define PCD_GET_EP_RX_STALL_STATUS(USBx, bEpNum) (PCD_GET_EP_RX_STATUS((USBx), (bEpNum)) == USB_EP_RX_STALL) + +/** + * @brief set & clear EP_KIND bit. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_EP_KIND(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_KIND)); \ + } while(0) /* PCD_SET_EP_KIND */ + +#define PCD_CLEAR_EP_KIND(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPKIND_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_CLEAR_EP_KIND */ + +/** + * @brief Sets/clears directly STATUS_OUT bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_OUT_STATUS(USBx, bEpNum) PCD_SET_EP_KIND((USBx), (bEpNum)) +#define PCD_CLEAR_OUT_STATUS(USBx, bEpNum) PCD_CLEAR_EP_KIND((USBx), (bEpNum)) + +/** + * @brief Sets/clears directly EP_KIND bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_SET_BULK_EP_DBUF(USBx, bEpNum) PCD_SET_EP_KIND((USBx), (bEpNum)) +#define PCD_CLEAR_BULK_EP_DBUF(USBx, bEpNum) PCD_CLEAR_EP_KIND((USBx), (bEpNum)) + +/** + * @brief Clears bit CTR_RX / CTR_TX in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_CLEAR_RX_EP_CTR(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0x7FFFU & USB_EPREG_MASK); \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_TX)); \ + } while(0) /* PCD_CLEAR_RX_EP_CTR */ + +#define PCD_CLEAR_TX_EP_CTR(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & (0xFF7FU & USB_EPREG_MASK); \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX)); \ + } while(0) /* PCD_CLEAR_TX_EP_CTR */ + +/** + * @brief Toggles DTOG_RX / DTOG_TX bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_RX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wEPVal; \ + \ + _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_RX)); \ + } while(0) /* PCD_RX_DTOG */ + +#define PCD_TX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wEPVal; \ + \ + _wEPVal = PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK; \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wEPVal | USB_EP_CTR_RX | USB_EP_CTR_TX | USB_EP_DTOG_TX)); \ + } while(0) /* PCD_TX_DTOG */ +/** + * @brief Clears DTOG_RX / DTOG_TX bit in the endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_CLEAR_RX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \ + \ + if ((_wRegVal & USB_EP_DTOG_RX) != 0U)\ + { \ + PCD_RX_DTOG((USBx), (bEpNum)); \ + } \ + } while(0) /* PCD_CLEAR_RX_DTOG */ + +#define PCD_CLEAR_TX_DTOG(USBx, bEpNum) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = PCD_GET_ENDPOINT((USBx), (bEpNum)); \ + \ + if ((_wRegVal & USB_EP_DTOG_TX) != 0U)\ + { \ + PCD_TX_DTOG((USBx), (bEpNum)); \ + } \ + } while(0) /* PCD_CLEAR_TX_DTOG */ + +/** + * @brief Sets address in an endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param bAddr Address. + * @retval None + */ +#define PCD_SET_EP_ADDRESS(USBx, bEpNum, bAddr) \ + do { \ + uint16_t _wRegVal; \ + \ + _wRegVal = (PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPREG_MASK) | (bAddr); \ + \ + PCD_SET_ENDPOINT((USBx), (bEpNum), (_wRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); \ + } while(0) /* PCD_SET_EP_ADDRESS */ + +/** + * @brief Gets address in an endpoint register. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_GET_EP_ADDRESS(USBx, bEpNum) ((uint8_t)(PCD_GET_ENDPOINT((USBx), (bEpNum)) & USB_EPADDR_FIELD)) + +#define PCD_EP_TX_CNT(USBx, bEpNum) \ + ((uint16_t *)((((uint32_t)(USBx)->BTABLE + \ + ((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U))) + +#define PCD_EP_RX_CNT(USBx, bEpNum) \ + ((uint16_t *)((((uint32_t)(USBx)->BTABLE + \ + ((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS) + ((uint32_t)(USBx) + 0x400U))) + + +/** + * @brief sets address of the tx/rx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wAddr address to be set (must be word aligned). + * @retval None + */ +#define PCD_SET_EP_TX_ADDRESS(USBx, bEpNum, wAddr) \ + do { \ + __IO uint16_t *_wRegVal; \ + uint32_t _wRegBase = (uint32_t)USBx; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + (((uint32_t)(bEpNum) * 8U) * PMA_ACCESS)); \ + *_wRegVal = ((wAddr) >> 1) << 1; \ + } while(0) /* PCD_SET_EP_TX_ADDRESS */ + +#define PCD_SET_EP_RX_ADDRESS(USBx, bEpNum, wAddr) \ + do { \ + __IO uint16_t *_wRegVal; \ + uint32_t _wRegBase = (uint32_t)USBx; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 4U) * PMA_ACCESS)); \ + *_wRegVal = ((wAddr) >> 1) << 1; \ + } while(0) /* PCD_SET_EP_RX_ADDRESS */ + +/** + * @brief Gets address of the tx/rx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval address of the buffer. + */ +#define PCD_GET_EP_TX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_TX_ADDRESS((USBx), (bEpNum))) +#define PCD_GET_EP_RX_ADDRESS(USBx, bEpNum) ((uint16_t)*PCD_EP_RX_ADDRESS((USBx), (bEpNum))) + +/** + * @brief Sets counter of rx buffer with no. of blocks. + * @param pdwReg Register pointer + * @param wCount Counter. + * @param wNBlocks no. of Blocks. + * @retval None + */ +#define PCD_CALC_BLK32(pdwReg, wCount, wNBlocks) \ + do { \ + (wNBlocks) = (wCount) >> 5; \ + if (((wCount) & 0x1fU) == 0U) \ + { \ + (wNBlocks)--; \ + } \ + *(pdwReg) |= (uint16_t)(((wNBlocks) << 10) | USB_CNTRX_BLSIZE); \ + } while(0) /* PCD_CALC_BLK32 */ + +#define PCD_CALC_BLK2(pdwReg, wCount, wNBlocks) \ + do { \ + (wNBlocks) = (wCount) >> 1; \ + if (((wCount) & 0x1U) != 0U) \ + { \ + (wNBlocks)++; \ + } \ + *(pdwReg) |= (uint16_t)((wNBlocks) << 10); \ + } while(0) /* PCD_CALC_BLK2 */ + +#define PCD_SET_EP_CNT_RX_REG(pdwReg, wCount) \ + do { \ + uint32_t wNBlocks; \ + \ + *(pdwReg) &= 0x3FFU; \ + \ + if ((wCount) > 62U) \ + { \ + PCD_CALC_BLK32((pdwReg), (wCount), wNBlocks); \ + } \ + else \ + { \ + if ((wCount) == 0U) \ + { \ + *(pdwReg) |= USB_CNTRX_BLSIZE; \ + } \ + else \ + { \ + PCD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \ + } \ + } \ + } while(0) /* PCD_SET_EP_CNT_RX_REG */ + +#define PCD_SET_EP_RX_DBUF0_CNT(USBx, bEpNum, wCount) \ + do { \ + uint32_t _wRegBase = (uint32_t)(USBx); \ + __IO uint16_t *pdwReg; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + pdwReg = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \ + PCD_SET_EP_CNT_RX_REG(pdwReg, (wCount)); \ + } while(0) + +/** + * @brief sets counter for the tx/rx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wCount Counter value. + * @retval None + */ +#define PCD_SET_EP_TX_CNT(USBx, bEpNum, wCount) \ + do { \ + uint32_t _wRegBase = (uint32_t)(USBx); \ + __IO uint16_t *_wRegVal; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 2U) * PMA_ACCESS)); \ + *_wRegVal = (uint16_t)(wCount); \ + } while(0) + +#define PCD_SET_EP_RX_CNT(USBx, bEpNum, wCount) \ + do { \ + uint32_t _wRegBase = (uint32_t)(USBx); \ + __IO uint16_t *_wRegVal; \ + \ + _wRegBase += (uint32_t)(USBx)->BTABLE; \ + _wRegVal = (__IO uint16_t *)(_wRegBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \ + PCD_SET_EP_CNT_RX_REG(_wRegVal, (wCount)); \ + } while(0) + +/** + * @brief gets counter of the tx buffer. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval Counter value + */ +#define PCD_GET_EP_TX_CNT(USBx, bEpNum) ((uint32_t)(*PCD_EP_TX_CNT((USBx), (bEpNum))) & 0x3ffU) +#define PCD_GET_EP_RX_CNT(USBx, bEpNum) ((uint32_t)(*PCD_EP_RX_CNT((USBx), (bEpNum))) & 0x3ffU) + +/** + * @brief Sets buffer 0/1 address in a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wBuf0Addr buffer 0 address. + * @retval Counter value + */ +#define PCD_SET_EP_DBUF0_ADDR(USBx, bEpNum, wBuf0Addr) \ + do { \ + PCD_SET_EP_TX_ADDRESS((USBx), (bEpNum), (wBuf0Addr)); \ + } while(0) /* PCD_SET_EP_DBUF0_ADDR */ + +#define PCD_SET_EP_DBUF1_ADDR(USBx, bEpNum, wBuf1Addr) \ + do { \ + PCD_SET_EP_RX_ADDRESS((USBx), (bEpNum), (wBuf1Addr)); \ + } while(0) /* PCD_SET_EP_DBUF1_ADDR */ + +/** + * @brief Sets addresses in a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param wBuf0Addr: buffer 0 address. + * @param wBuf1Addr = buffer 1 address. + * @retval None + */ +#define PCD_SET_EP_DBUF_ADDR(USBx, bEpNum, wBuf0Addr, wBuf1Addr) \ + do { \ + PCD_SET_EP_DBUF0_ADDR((USBx), (bEpNum), (wBuf0Addr)); \ + PCD_SET_EP_DBUF1_ADDR((USBx), (bEpNum), (wBuf1Addr)); \ + } while(0) /* PCD_SET_EP_DBUF_ADDR */ + +/** + * @brief Gets buffer 0/1 address of a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_GET_EP_DBUF0_ADDR(USBx, bEpNum) (PCD_GET_EP_TX_ADDRESS((USBx), (bEpNum))) +#define PCD_GET_EP_DBUF1_ADDR(USBx, bEpNum) (PCD_GET_EP_RX_ADDRESS((USBx), (bEpNum))) + +/** + * @brief Gets buffer 0/1 address of a double buffer endpoint. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @param bDir endpoint dir EP_DBUF_OUT = OUT + * EP_DBUF_IN = IN + * @param wCount: Counter value + * @retval None + */ +#define PCD_SET_EP_DBUF0_CNT(USBx, bEpNum, bDir, wCount) \ + do { \ + if ((bDir) == 0U) \ + /* OUT endpoint */ \ + { \ + PCD_SET_EP_RX_DBUF0_CNT((USBx), (bEpNum), (wCount)); \ + } \ + else \ + { \ + if ((bDir) == 1U) \ + { \ + /* IN endpoint */ \ + PCD_SET_EP_TX_CNT((USBx), (bEpNum), (wCount)); \ + } \ + } \ + } while(0) /* SetEPDblBuf0Count*/ + +#define PCD_SET_EP_DBUF1_CNT(USBx, bEpNum, bDir, wCount) \ + do { \ + uint32_t _wBase = (uint32_t)(USBx); \ + __IO uint16_t *_wEPRegVal; \ + \ + if ((bDir) == 0U) \ + { \ + /* OUT endpoint */ \ + PCD_SET_EP_RX_CNT((USBx), (bEpNum), (wCount)); \ + } \ + else \ + { \ + if ((bDir) == 1U) \ + { \ + /* IN endpoint */ \ + _wBase += (uint32_t)(USBx)->BTABLE; \ + _wEPRegVal = (__IO uint16_t *)(_wBase + 0x400U + ((((uint32_t)(bEpNum) * 8U) + 6U) * PMA_ACCESS)); \ + *_wEPRegVal = (uint16_t)(wCount); \ + } \ + } \ + } while(0) /* SetEPDblBuf1Count */ + +#define PCD_SET_EP_DBUF_CNT(USBx, bEpNum, bDir, wCount) \ + do { \ + PCD_SET_EP_DBUF0_CNT((USBx), (bEpNum), (bDir), (wCount)); \ + PCD_SET_EP_DBUF1_CNT((USBx), (bEpNum), (bDir), (wCount)); \ + } while(0) /* PCD_SET_EP_DBUF_CNT */ + +/** + * @brief Gets buffer 0/1 rx/tx counter for double buffering. + * @param USBx USB peripheral instance register address. + * @param bEpNum Endpoint Number. + * @retval None + */ +#define PCD_GET_EP_DBUF0_CNT(USBx, bEpNum) (PCD_GET_EP_TX_CNT((USBx), (bEpNum))) +#define PCD_GET_EP_DBUF1_CNT(USBx, bEpNum) (PCD_GET_EP_RX_CNT((USBx), (bEpNum))) + +#endif /* defined (USB) */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB) || defined (USB_OTG_FS) */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F1xx_HAL_PCD_H */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd_ex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd_ex.h new file mode 100644 index 0000000..30ef673 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pcd_ex.h @@ -0,0 +1,85 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_pcd_ex.h + * @author MCD Application Team + * @brief Header file of PCD 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 STM32F1xx_HAL_PCD_EX_H +#define STM32F1xx_HAL_PCD_EX_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +#if defined (USB) || defined (USB_OTG_FS) +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup PCDEx + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PCDEx_Exported_Functions PCDEx Exported Functions + * @{ + */ +/** @addtogroup PCDEx_Exported_Functions_Group1 Peripheral Control functions + * @{ + */ + +#if defined (USB_OTG_FS) +HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); +HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size); +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +HAL_StatusTypeDef HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd, uint16_t ep_addr, + uint16_t ep_kind, uint32_t pmaadress); + +void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state); +#endif /* defined (USB) */ +void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg); +void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB) || defined (USB_OTG_FS) */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* STM32F1xx_HAL_PCD_EX_H */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h new file mode 100644 index 0000000..41f98af --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h @@ -0,0 +1,385 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_pwr.h + * @author MCD Application Team + * @brief Header file of PWR 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 __STM32F1xx_HAL_PWR_H +#define __STM32F1xx_HAL_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_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; + + +/** + * @} + */ + + +/* Internal constants --------------------------------------------------------*/ + +/** @addtogroup PWR_Private_Constants + * @{ + */ + +#define PWR_EXTI_LINE_PVD ((uint32_t)0x00010000) /*!< External interrupt line 16 Connected to the PVD EXTI Line */ + +/** + * @} + */ + + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_PVD_detection_level PWR PVD detection level + * @{ + */ +#define PWR_PVDLEVEL_0 PWR_CR_PLS_2V2 +#define PWR_PVDLEVEL_1 PWR_CR_PLS_2V3 +#define PWR_PVDLEVEL_2 PWR_CR_PLS_2V4 +#define PWR_PVDLEVEL_3 PWR_CR_PLS_2V5 +#define PWR_PVDLEVEL_4 PWR_CR_PLS_2V6 +#define PWR_PVDLEVEL_5 PWR_CR_PLS_2V7 +#define PWR_PVDLEVEL_6 PWR_CR_PLS_2V8 +#define PWR_PVDLEVEL_7 PWR_CR_PLS_2V9 + +/** + * @} + */ + +/** @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_WakeUp_Pins PWR WakeUp Pins + * @{ + */ + +#define PWR_WAKEUP_PIN1 PWR_CSR_EWUP + +/** + * @} + */ + +/** @defgroup PWR_Regulator_state_in_SLEEP_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) + +/** + * @} + */ + +/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry + * @{ + */ +#define PWR_STOPENTRY_WFI ((uint8_t)0x01) +#define PWR_STOPENTRY_WFE ((uint8_t)0x02) + +/** + * @} + */ + +/** @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 + + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_Exported_Macros PWR Exported Macros + * @{ + */ + +/** @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 + * 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. + * @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__) SET_BIT(PWR->CR, ((__FLAG__) << 2)) + +/** + * @brief Enable interrupt on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_IT() SET_BIT(EXTI->IMR, PWR_EXTI_LINE_PVD) + +/** + * @brief Disable interrupt on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_IT() CLEAR_BIT(EXTI->IMR, PWR_EXTI_LINE_PVD) + +/** + * @brief Enable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_EVENT() SET_BIT(EXTI->EMR, PWR_EXTI_LINE_PVD) + +/** + * @brief Disable event on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_EVENT() CLEAR_BIT(EXTI->EMR, PWR_EXTI_LINE_PVD) + + +/** + * @brief PVD EXTI line configuration: set falling edge 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 edge 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. + * This parameter can be: + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE() CLEAR_BIT(EXTI->RTSR, 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() __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();__HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + +/** + * @brief Disable the PVD Extended Interrupt Rising & Falling Trigger. + * This parameter can be: + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();__HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + + + +/** + * @brief Check 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 Generate a Software interrupt on selected EXTI line. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() SET_BIT(EXTI->SWIER, PWR_EXTI_LINE_PVD) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup PWR_Private_Macros PWR Private Macros + * @{ + */ +#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_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1)) + +#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)) + +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) + +/** + * @} + */ + + + +/* 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 ************************************************/ +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); +/* #define HAL_PWR_ConfigPVD 12*/ +void HAL_PWR_EnablePVD(void); +void HAL_PWR_DisablePVD(void); + +/* WakeUp pins configuration functions ****************************************/ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); + +/* Low Power modes configuration functions ************************************/ +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); + +void HAL_PWR_EnableSleepOnExit(void); +void HAL_PWR_DisableSleepOnExit(void); +void HAL_PWR_EnableSEVOnPend(void); +void HAL_PWR_DisableSEVOnPend(void); + + + +void HAL_PWR_PVD_IRQHandler(void); +void HAL_PWR_PVDCallback(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F1xx_HAL_PWR_H */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h new file mode 100644 index 0000000..9814caf --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h @@ -0,0 +1,1375 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_rcc.h + * @author MCD Application Team + * @brief Header file of RCC 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 __STM32F1xx_HAL_RCC_H +#define __STM32F1xx_HAL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Types RCC Exported Types + * @{ + */ + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLLState; /*!< PLLState: The new state of the PLL. + This parameter can be a value of @ref RCC_PLL_Config */ + + uint32_t PLLSource; /*!< PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Clock_Source */ + + uint32_t PLLMUL; /*!< PLLMUL: Multiplication factor for PLL VCO input clock + This parameter must be a value of @ref RCCEx_PLL_Multiplication_Factor */ +} RCC_PLLInitTypeDef; + +/** + * @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_PLL_Clock_Source PLL Clock Source + * @{ + */ + +#define RCC_PLLSOURCE_HSI_DIV2 0x00000000U /*!< HSI clock divided by 2 selected as PLL entry clock source */ +#define RCC_PLLSOURCE_HSE RCC_CFGR_PLLSRC /*!< HSE clock selected as PLL entry clock source */ + +/** + * @} + */ + +/** @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 /*!< HSE clock deactivation */ +#define RCC_HSE_ON RCC_CR_HSEON /*!< HSE clock activation */ +#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) /*!< External clock source for HSE clock */ +/** + * @} + */ + +/** @defgroup RCC_LSE_Config LSE Config + * @{ + */ +#define RCC_LSE_OFF 0x00000000U /*!< LSE clock deactivation */ +#define RCC_LSE_ON RCC_BDCR_LSEON /*!< LSE clock activation */ +#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) /*!< External clock source for LSE clock */ + +/** + * @} + */ + +/** @defgroup RCC_HSI_Config HSI Config + * @{ + */ +#define RCC_HSI_OFF 0x00000000U /*!< HSI clock deactivation */ +#define RCC_HSI_ON RCC_CR_HSION /*!< HSI clock activation */ + +#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ + +/** + * @} + */ + +/** @defgroup RCC_LSI_Config LSI Config + * @{ + */ +#define RCC_LSI_OFF 0x00000000U /*!< LSI clock deactivation */ +#define RCC_LSI_ON RCC_CSR_LSION /*!< LSI clock activation */ + +/** + * @} + */ + +/** @defgroup RCC_PLL_Config PLL Config + * @{ + */ +#define RCC_PLL_NONE 0x00000000U /*!< PLL is not configured */ +#define RCC_PLL_OFF 0x00000001U /*!< PLL deactivation */ +#define RCC_PLL_ON 0x00000002U /*!< PLL activation */ + +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Type System Clock Type + * @{ + */ +#define RCC_CLOCKTYPE_SYSCLK 0x00000001U /*!< SYSCLK to configure */ +#define RCC_CLOCKTYPE_HCLK 0x00000002U /*!< HCLK to configure */ +#define RCC_CLOCKTYPE_PCLK1 0x00000004U /*!< PCLK1 to configure */ +#define RCC_CLOCKTYPE_PCLK2 0x00000008U /*!< PCLK2 to configure */ + +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source System Clock Source + * @{ + */ +#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selected as system clock */ +#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selected as system clock */ +#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL /*!< PLL selected as system clock */ + +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status + * @{ + */ +#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 */ + +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source AHB Clock Source + * @{ + */ +#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ +#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ +#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ +#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ +#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ +#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ +#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ +#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ +#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ + +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source APB1 APB2 Clock Source + * @{ + */ +#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ +#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ +#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ +#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ +#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ + +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source RTC Clock Source + * @{ + */ +#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U /*!< No clock */ +#define RCC_RTCCLKSOURCE_LSE RCC_BDCR_RTCSEL_LSE /*!< LSE oscillator clock used as RTC clock */ +#define RCC_RTCCLKSOURCE_LSI RCC_BDCR_RTCSEL_LSI /*!< LSI oscillator clock used as RTC clock */ +#define RCC_RTCCLKSOURCE_HSE_DIV128 RCC_BDCR_RTCSEL_HSE /*!< HSE oscillator clock divided by 128 used as RTC clock */ +/** + * @} + */ + + +/** @defgroup RCC_MCO_Index MCO Index + * @{ + */ +#define RCC_MCO1 0x00000000U +#define RCC_MCO RCC_MCO1 /*!< MCO1 to be compliant with other families with 2 MCOs*/ + +/** + * @} + */ + +/** @defgroup RCC_MCOx_Clock_Prescaler MCO Clock Prescaler + * @{ + */ +#define RCC_MCODIV_1 0x00000000U + +/** + * @} + */ + +/** @defgroup RCC_Interrupt Interrupts + * @{ + */ +#define RCC_IT_LSIRDY ((uint8_t)RCC_CIR_LSIRDYF) /*!< LSI Ready Interrupt flag */ +#define RCC_IT_LSERDY ((uint8_t)RCC_CIR_LSERDYF) /*!< LSE Ready Interrupt flag */ +#define RCC_IT_HSIRDY ((uint8_t)RCC_CIR_HSIRDYF) /*!< HSI Ready Interrupt flag */ +#define RCC_IT_HSERDY ((uint8_t)RCC_CIR_HSERDYF) /*!< HSE Ready Interrupt flag */ +#define RCC_IT_PLLRDY ((uint8_t)RCC_CIR_PLLRDYF) /*!< PLL Ready Interrupt flag */ +#define RCC_IT_CSS ((uint8_t)RCC_CIR_CSSF) /*!< Clock Security System Interrupt flag */ +/** + * @} + */ + +/** @defgroup RCC_Flag Flags + * Elements values convention: XXXYYYYYb + * - YYYYY : Flag position in the register + * - XXX : Register index + * - 001: CR register + * - 010: BDCR register + * - 011: CSR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_HSIRDY ((uint8_t)((CR_REG_INDEX << 5U) | RCC_CR_HSIRDY_Pos)) /*!< Internal High Speed clock ready flag */ +#define RCC_FLAG_HSERDY ((uint8_t)((CR_REG_INDEX << 5U) | RCC_CR_HSERDY_Pos)) /*!< External High Speed clock ready flag */ +#define RCC_FLAG_PLLRDY ((uint8_t)((CR_REG_INDEX << 5U) | RCC_CR_PLLRDY_Pos)) /*!< PLL clock ready flag */ + +/* Flags in the CSR register */ +#define RCC_FLAG_LSIRDY ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_LSIRDY_Pos)) /*!< Internal Low Speed oscillator Ready */ +#define RCC_FLAG_PINRST ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_PINRSTF_Pos)) /*!< PIN reset flag */ +#define RCC_FLAG_PORRST ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_PORRSTF_Pos)) /*!< POR/PDR reset flag */ +#define RCC_FLAG_SFTRST ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_SFTRSTF_Pos)) /*!< Software Reset flag */ +#define RCC_FLAG_IWDGRST ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_IWDGRSTF_Pos)) /*!< Independent Watchdog reset flag */ +#define RCC_FLAG_WWDGRST ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_WWDGRSTF_Pos)) /*!< Window watchdog reset flag */ +#define RCC_FLAG_LPWRRST ((uint8_t)((CSR_REG_INDEX << 5U) | RCC_CSR_LPWRRSTF_Pos)) /*!< Low-Power reset flag */ + +/* Flags in the BDCR register */ +#define RCC_FLAG_LSERDY ((uint8_t)((BDCR_REG_INDEX << 5U) | RCC_BDCR_LSERDY_Pos)) /*!< External Low Speed oscillator Ready */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_Peripheral_Clock_Enable_Disable 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_DMA1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_SRAMEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_SRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FLITF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_FLITFEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FLITFEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_DMA1EN)) +#define __HAL_RCC_SRAM_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_SRAMEN)) +#define __HAL_RCC_FLITF_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_FLITFEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_CRCEN)) + +/** + * @} + */ + +/** @defgroup RCC_AHB_Peripheral_Clock_Enable_Disable_Status AHB Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB 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_DMA1_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA1EN)) != RESET) +#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA1EN)) == RESET) +#define __HAL_RCC_SRAM_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_SRAMEN)) != RESET) +#define __HAL_RCC_SRAM_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_SRAMEN)) == RESET) +#define __HAL_RCC_FLITF_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_FLITFEN)) != RESET) +#define __HAL_RCC_FLITF_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_FLITFEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_CRCEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_CRCEN)) == RESET) + +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 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; \ + 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; \ + 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_WWDG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_USART2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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_BKP_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_BKPEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_BKPEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_PWR_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) +#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_BKP_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_BKPEN)) +#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_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) +#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) +#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) +#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) +#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) +#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) +#define __HAL_RCC_BKP_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_BKPEN)) != RESET) +#define __HAL_RCC_BKP_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_BKPEN)) == RESET) +#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) +#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) + +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 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_AFIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_AFIOEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\ + /* Delay after an RCC peripheral clock enabling */\ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_USART1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_AFIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_AFIOEN)) +#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPAEN)) +#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPBEN)) +#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPCEN)) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPDEN)) +#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) + +#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) + +/** + * @} + */ + +/** @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_AFIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_AFIOEN)) != RESET) +#define __HAL_RCC_AFIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_AFIOEN)) == RESET) +#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPAEN)) != RESET) +#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPAEN)) == RESET) +#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPBEN)) != RESET) +#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPBEN)) == RESET) +#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPCEN)) != RESET) +#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPCEN)) == RESET) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPDEN)) != RESET) +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPDEN)) == RESET) +#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) +#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) +#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) +#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) +#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) + +/** + * @} + */ + +/** @defgroup RCC_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFFFFFFU) +#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_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) +#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_BKP_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_BKPRST)) +#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00) +#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_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) +#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_BKP_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_BKPRST)) +#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_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_AFIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_AFIORST)) +#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPARST)) +#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPBRST)) +#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPCRST)) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPDRST)) +#define __HAL_RCC_ADC1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADC1RST)) + +#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00) +#define __HAL_RCC_AFIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_AFIORST)) +#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPARST)) +#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPBRST)) +#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPCRST)) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPDRST)) +#define __HAL_RCC_ADC1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADC1RST)) + +#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) + +/** + * @} + */ + +/** @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. + * @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. + * @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 Macro to enable 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. + */ +#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) + +/** @brief Macro to disable the Internal Low Speed oscillator (LSI). + * @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_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 @ref RCC_HSE_OFF turn OFF the HSE oscillator, HSERDY flag goes low after + * 6 HSE oscillator clock cycles. + * @arg @ref RCC_HSE_ON turn ON the HSE oscillator + * @arg @ref 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_OFF) \ + { \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ + } \ + 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 Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. + * @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 + * @ref 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 @ref RCC_LSE_OFF turn OFF the LSE oscillator, LSERDY flag goes low after + * 6 LSE oscillator clock cycles. + * @arg @ref RCC_LSE_ON turn ON the LSE oscillator. + * @arg @ref 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_OFF) \ + { \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + } \ + 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_PLL_Configuration PLL Configuration + * @{ + */ + +/** @brief Macro to enable 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 is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) + +/** @brief Macro to disable the main PLL. + * @note The main PLL can not be disabled if it is used as system clock source + */ +#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) + +/** @brief Macro to configure the main PLL clock source and multiplication 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 @ref RCC_PLLSOURCE_HSI_DIV2 HSI oscillator clock selected as PLL clock entry + * @arg @ref RCC_PLLSOURCE_HSE HSE oscillator clock selected as PLL clock entry + * @param __PLLMUL__ specifies the multiplication factor for PLL VCO output clock + * This parameter can be one of the following values: + * @arg @ref RCC_PLL_MUL4 PLLVCO = PLL clock entry x 4 + * @arg @ref RCC_PLL_MUL6 PLLVCO = PLL clock entry x 6 + @if STM32F105xC + * @arg @ref RCC_PLL_MUL6_5 PLLVCO = PLL clock entry x 6.5 + @elseif STM32F107xC + * @arg @ref RCC_PLL_MUL6_5 PLLVCO = PLL clock entry x 6.5 + @else + * @arg @ref RCC_PLL_MUL2 PLLVCO = PLL clock entry x 2 + * @arg @ref RCC_PLL_MUL3 PLLVCO = PLL clock entry x 3 + * @arg @ref RCC_PLL_MUL10 PLLVCO = PLL clock entry x 10 + * @arg @ref RCC_PLL_MUL11 PLLVCO = PLL clock entry x 11 + * @arg @ref RCC_PLL_MUL12 PLLVCO = PLL clock entry x 12 + * @arg @ref RCC_PLL_MUL13 PLLVCO = PLL clock entry x 13 + * @arg @ref RCC_PLL_MUL14 PLLVCO = PLL clock entry x 14 + * @arg @ref RCC_PLL_MUL15 PLLVCO = PLL clock entry x 15 + * @arg @ref RCC_PLL_MUL16 PLLVCO = PLL clock entry x 16 + @endif + * @arg @ref RCC_PLL_MUL8 PLLVCO = PLL clock entry x 8 + * @arg @ref RCC_PLL_MUL9 PLLVCO = PLL clock entry x 9 + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSOURCE__, __PLLMUL__)\ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL),((__RCC_PLLSOURCE__) | (__PLLMUL__) )) + +/** @brief Get oscillator clock selected as PLL input clock + * @retval The clock source used for PLL entry. The returned value can be one + * of the following: + * @arg @ref RCC_PLLSOURCE_HSI_DIV2 HSI oscillator clock selected as PLL input clock + * @arg @ref RCC_PLLSOURCE_HSE HSE oscillator clock selected as PLL input clock + */ +#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLSRC))) + +/** + * @} + */ + +/** @defgroup RCC_Get_Clock_source Get Clock source + * @{ + */ + +/** + * @brief Macro to configure the system clock source. + * @param __SYSCLKSOURCE__ specifies the system clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_SYSCLKSOURCE_HSI HSI oscillator is used as system clock source. + * @arg @ref RCC_SYSCLKSOURCE_HSE HSE oscillator is used as system clock source. + * @arg @ref RCC_SYSCLKSOURCE_PLLCLK PLL output is used as system clock source. + */ +#define __HAL_RCC_SYSCLK_CONFIG(__SYSCLKSOURCE__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__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: + * @arg @ref RCC_SYSCLKSOURCE_STATUS_HSI HSI used as system clock + * @arg @ref RCC_SYSCLKSOURCE_STATUS_HSE HSE used as system clock + * @arg @ref RCC_SYSCLKSOURCE_STATUS_PLLCLK PLL used as system clock + */ +#define __HAL_RCC_GET_SYSCLK_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR,RCC_CFGR_SWS))) + +/** + * @} + */ + +/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config + * @{ + */ + +#if defined(RCC_CFGR_MCO_3) +/** @brief Macro to configure the MCO clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_SYSCLK System clock (SYSCLK) selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK PLL clock divided by 2 selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLL2CLK PLL2 clock selected by 2 selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLL3CLK_DIV2 PLL3 clock divided by 2 selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_EXT_HSE XT1 external 3-25 MHz oscillator clock selected (for Ethernet) as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLL3CLK PLL3 clock selected (for Ethernet) as MCO clock + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 No division applied on MCO clock source + */ +#else +/** @brief Macro to configure the MCO clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_SYSCLK System clock (SYSCLK) selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK PLL clock divided by 2 selected as MCO clock + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 No division applied on MCO clock source + */ +#endif + +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_MCO, (__MCOCLKSOURCE__)) + + +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Configuration RCC RTC Clock Configuration +* @{ +*/ + +/** @brief Macro 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 @ref __HAL_RCC_BACKUPRESET_FORCE() macro, or by + * a Power On Reset (POR). + * + * @param __RTC_CLKSOURCE__ 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_DIV128 HSE divided by 128 selected as RTC clock + * @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 wakeup 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_CONFIG(__RTC_CLKSOURCE__) MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, (__RTC_CLKSOURCE__)) + +/** @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_DIV128 HSE divided by 128 selected as RTC clock + */ +#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) + +/** @brief Macro to enable the 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) + +/** @brief Macro to disable the the RTC clock. + * @note These macros must be used only after the RTC clock source was selected. + */ +#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) + +/** @brief Macro to force the Backup domain reset. + * @note This function resets the RTC peripheral (including the backup registers) + * and the RTC clock source selection in RCC_BDCR register. + */ +#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) + +/** @brief Macros to release the Backup domain reset. + */ +#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) + +/** + * @} + */ + +/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management + * @brief macros to manage the specified RCC Flags and interrupts. + * @{ + */ + +/** @brief Enable RCC interrupt. + * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt + * @arg @ref RCC_IT_LSERDY LSE ready interrupt + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt + * @arg @ref RCC_IT_HSERDY HSE ready interrupt + * @arg @ref RCC_IT_PLLRDY main PLL ready interrupt + @if STM32F105xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @elsif STM32F107xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @endif + */ +#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) + +/** @brief Disable RCC interrupt. + * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt + * @arg @ref RCC_IT_LSERDY LSE ready interrupt + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt + * @arg @ref RCC_IT_HSERDY HSE ready interrupt + * @arg @ref RCC_IT_PLLRDY main PLL ready interrupt + @if STM32F105xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @elsif STM32F107xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @endif + */ +#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) + +/** @brief Clear the RCC's interrupt pending bits. + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt. + * @arg @ref RCC_IT_LSERDY LSE ready interrupt. + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt. + * @arg @ref RCC_IT_HSERDY HSE ready interrupt. + * @arg @ref RCC_IT_PLLRDY Main PLL ready interrupt. + @if STM32F105xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @elsif STM32F107xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @endif + * @arg @ref 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 @ref RCC_IT_LSIRDY LSI ready interrupt. + * @arg @ref RCC_IT_LSERDY LSE ready interrupt. + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt. + * @arg @ref RCC_IT_HSERDY HSE ready interrupt. + * @arg @ref RCC_IT_PLLRDY Main PLL ready interrupt. + @if STM32F105xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @elsif STM32F107xx + * @arg @ref RCC_IT_PLL2RDY Main PLL2 ready interrupt. + * @arg @ref RCC_IT_PLLI2S2RDY Main PLLI2S ready interrupt. + @endif + * @arg @ref 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. + * The reset flags are RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, + * RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST + */ +#define __HAL_RCC_CLEAR_RESET_FLAGS() (*(__IO uint32_t *)RCC_CSR_RMVF_BB = ENABLE) + +/** @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 @ref RCC_FLAG_HSIRDY HSI oscillator clock ready. + * @arg @ref RCC_FLAG_HSERDY HSE oscillator clock ready. + * @arg @ref RCC_FLAG_PLLRDY Main PLL clock ready. + @if STM32F105xx + * @arg @ref RCC_FLAG_PLL2RDY Main PLL2 clock ready. + * @arg @ref RCC_FLAG_PLLI2SRDY Main PLLI2S clock ready. + @elsif STM32F107xx + * @arg @ref RCC_FLAG_PLL2RDY Main PLL2 clock ready. + * @arg @ref RCC_FLAG_PLLI2SRDY Main PLLI2S clock ready. + @endif + * @arg @ref RCC_FLAG_LSERDY LSE oscillator clock ready. + * @arg @ref RCC_FLAG_LSIRDY LSI oscillator clock ready. + * @arg @ref RCC_FLAG_PINRST Pin reset. + * @arg @ref RCC_FLAG_PORRST POR/PDR reset. + * @arg @ref RCC_FLAG_SFTRST Software reset. + * @arg @ref RCC_FLAG_IWDGRST Independent Watchdog reset. + * @arg @ref RCC_FLAG_WWDGRST Window Watchdog reset. + * @arg @ref RCC_FLAG_LPWRRST Low Power reset. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((__FLAG__) >> 5U) == CR_REG_INDEX)? RCC->CR : \ + ((((__FLAG__) >> 5U) == BDCR_REG_INDEX)? RCC->BDCR : \ + RCC->CSR)) & (1U << ((__FLAG__) & RCC_FLAG_MASK))) + +/** + * @} + */ + +/** + * @} + */ + +/* Include RCC HAL Extension module */ +#include "stm32f1xx_hal_rcc_ex.h" + +/* 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(RCC_OscInitTypeDef *RCC_OscInitStruct); +HAL_StatusTypeDef HAL_RCC_ClockConfig(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); + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup RCC_Private_Constants + * @{ + */ + +/** @defgroup RCC_Timeout RCC Timeout + * @{ + */ + +/* Disable Backup domain write protection state change timeout */ +#define RCC_DBP_TIMEOUT_VALUE 100U /* 100 ms */ +/* LSE state change timeout */ +#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT +#define CLOCKSWITCH_TIMEOUT_VALUE 5000 /* 5 s */ +#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT +#define HSI_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */ +#define LSI_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */ +#define PLL_TIMEOUT_VALUE 2U /* 2 ms (minimum Tick + 1) */ + +/** + * @} + */ + +/** @defgroup RCC_Register_Offset Register offsets + * @{ + */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) +#define RCC_CR_OFFSET 0x00U +#define RCC_CFGR_OFFSET 0x04U +#define RCC_CIR_OFFSET 0x08U +#define RCC_BDCR_OFFSET 0x20U +#define RCC_CSR_OFFSET 0x24U + +/** + * @} + */ + +/** @defgroup RCC_BitAddress_AliasRegion BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +#define RCC_CR_OFFSET_BB (RCC_OFFSET + RCC_CR_OFFSET) +#define RCC_CFGR_OFFSET_BB (RCC_OFFSET + RCC_CFGR_OFFSET) +#define RCC_CIR_OFFSET_BB (RCC_OFFSET + RCC_CIR_OFFSET) +#define RCC_BDCR_OFFSET_BB (RCC_OFFSET + RCC_BDCR_OFFSET) +#define RCC_CSR_OFFSET_BB (RCC_OFFSET + RCC_CSR_OFFSET) + +/* --- CR Register ---*/ +/* Alias word address of HSION bit */ +#define RCC_HSION_BIT_NUMBER RCC_CR_HSION_Pos +#define RCC_CR_HSION_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_HSION_BIT_NUMBER * 4U))) +/* Alias word address of HSEON bit */ +#define RCC_HSEON_BIT_NUMBER RCC_CR_HSEON_Pos +#define RCC_CR_HSEON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_HSEON_BIT_NUMBER * 4U))) +/* Alias word address of CSSON bit */ +#define RCC_CSSON_BIT_NUMBER RCC_CR_CSSON_Pos +#define RCC_CR_CSSON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_CSSON_BIT_NUMBER * 4U))) +/* Alias word address of PLLON bit */ +#define RCC_PLLON_BIT_NUMBER RCC_CR_PLLON_Pos +#define RCC_CR_PLLON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_PLLON_BIT_NUMBER * 4U))) + +/* --- CSR Register ---*/ +/* Alias word address of LSION bit */ +#define RCC_LSION_BIT_NUMBER RCC_CSR_LSION_Pos +#define RCC_CSR_LSION_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CSR_OFFSET_BB * 32U) + (RCC_LSION_BIT_NUMBER * 4U))) + +/* Alias word address of RMVF bit */ +#define RCC_RMVF_BIT_NUMBER RCC_CSR_RMVF_Pos +#define RCC_CSR_RMVF_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CSR_OFFSET_BB * 32U) + (RCC_RMVF_BIT_NUMBER * 4U))) + +/* --- BDCR Registers ---*/ +/* Alias word address of LSEON bit */ +#define RCC_LSEON_BIT_NUMBER RCC_BDCR_LSEON_Pos +#define RCC_BDCR_LSEON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_LSEON_BIT_NUMBER * 4U))) + +/* Alias word address of LSEON bit */ +#define RCC_LSEBYP_BIT_NUMBER RCC_BDCR_LSEBYP_Pos +#define RCC_BDCR_LSEBYP_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_LSEBYP_BIT_NUMBER * 4U))) + +/* Alias word address of RTCEN bit */ +#define RCC_RTCEN_BIT_NUMBER RCC_BDCR_RTCEN_Pos +#define RCC_BDCR_RTCEN_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U))) + +/* Alias word address of BDRST bit */ +#define RCC_BDRST_BIT_NUMBER RCC_BDCR_BDRST_Pos +#define RCC_BDCR_BDRST_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_BDRST_BIT_NUMBER * 4U))) + +/** + * @} + */ + +/* CR register byte 2 (Bits[23:16]) base address */ +#define RCC_CR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + RCC_CR_OFFSET + 0x02U)) + +/* CIR register byte 1 (Bits[15:8]) base address */ +#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + RCC_CIR_OFFSET + 0x01U)) + +/* CIR register byte 2 (Bits[23:16]) base address */ +#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + RCC_CIR_OFFSET + 0x02U)) + +/* Defines used for Flags */ +#define CR_REG_INDEX ((uint8_t)1) +#define BDCR_REG_INDEX ((uint8_t)2) +#define CSR_REG_INDEX ((uint8_t)3) + +#define RCC_FLAG_MASK ((uint8_t)0x1F) + +/** + * @} + */ + +/** @addtogroup RCC_Private_Macros + * @{ + */ +/** @defgroup RCC_Alias_For_Legacy Alias define maintained for legacy + * @{ + */ +#define __HAL_RCC_SYSCFG_CLK_DISABLE __HAL_RCC_AFIO_CLK_DISABLE +#define __HAL_RCC_SYSCFG_CLK_ENABLE __HAL_RCC_AFIO_CLK_ENABLE +#define __HAL_RCC_SYSCFG_FORCE_RESET __HAL_RCC_AFIO_FORCE_RESET +#define __HAL_RCC_SYSCFG_RELEASE_RESET __HAL_RCC_AFIO_RELEASE_RESET +/** + * @} + */ + +#define IS_RCC_PLLSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLSOURCE_HSI_DIV2) || \ + ((__SOURCE__) == RCC_PLLSOURCE_HSE)) +#define IS_RCC_OSCILLATORTYPE(__OSCILLATOR__) (((__OSCILLATOR__) == RCC_OSCILLATORTYPE_NONE) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)) +#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_CALIBRATION_VALUE(__VALUE__) ((__VALUE__) <= 0x1FU) +#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_CLOCKTYPE(CLK) ((((CLK) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) || \ + (((CLK) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) || \ + (((CLK) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) || \ + (((CLK) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)) +#define IS_RCC_SYSCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_SYSCLKSOURCE_HSI) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_HSE) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_PLLCLK)) +#define IS_RCC_SYSCLKSOURCE_STATUS(__SOURCE__) (((__SOURCE__) == RCC_SYSCLKSOURCE_STATUS_HSI) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_STATUS_HSE) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_STATUS_PLLCLK)) +#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_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(__MCO__) ((__MCO__) == RCC_MCO) +#define IS_RCC_MCODIV(__DIV__) (((__DIV__) == RCC_MCODIV_1)) +#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_NO_CLK) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV128)) + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_RCC_H */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h new file mode 100644 index 0000000..049d0ec --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h @@ -0,0 +1,1905 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_rcc_ex.h + * @author MCD Application Team + * @brief Header file of RCC 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 __STM32F1xx_HAL_RCC_EX_H +#define __STM32F1xx_HAL_RCC_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCCEx + * @{ + */ + +/** @addtogroup RCCEx_Private_Constants + * @{ + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + +/* Alias word address of PLLI2SON bit */ +#define PLLI2SON_BITNUMBER RCC_CR_PLL3ON_Pos +#define RCC_CR_PLLI2SON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (PLLI2SON_BITNUMBER * 4U))) +/* Alias word address of PLL2ON bit */ +#define PLL2ON_BITNUMBER RCC_CR_PLL2ON_Pos +#define RCC_CR_PLL2ON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (PLL2ON_BITNUMBER * 4U))) + +#define PLLI2S_TIMEOUT_VALUE 100U /* 100 ms */ +#define PLL2_TIMEOUT_VALUE 100U /* 100 ms */ + +#endif /* STM32F105xC || STM32F107xC */ + + +#define CR_REG_INDEX ((uint8_t)1) + +/** + * @} + */ + +/** @addtogroup RCCEx_Private_Macros + * @{ + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +#define IS_RCC_PREDIV1_SOURCE(__SOURCE__) (((__SOURCE__) == RCC_PREDIV1_SOURCE_HSE) || \ + ((__SOURCE__) == RCC_PREDIV1_SOURCE_PLL2)) +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F100xB)\ + || defined(STM32F100xE) +#define IS_RCC_HSE_PREDIV(__DIV__) (((__DIV__) == RCC_HSE_PREDIV_DIV1) || ((__DIV__) == RCC_HSE_PREDIV_DIV2) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV3) || ((__DIV__) == RCC_HSE_PREDIV_DIV4) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV5) || ((__DIV__) == RCC_HSE_PREDIV_DIV6) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV7) || ((__DIV__) == RCC_HSE_PREDIV_DIV8) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV9) || ((__DIV__) == RCC_HSE_PREDIV_DIV10) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV11) || ((__DIV__) == RCC_HSE_PREDIV_DIV12) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV13) || ((__DIV__) == RCC_HSE_PREDIV_DIV14) || \ + ((__DIV__) == RCC_HSE_PREDIV_DIV15) || ((__DIV__) == RCC_HSE_PREDIV_DIV16)) + +#else +#define IS_RCC_HSE_PREDIV(__DIV__) (((__DIV__) == RCC_HSE_PREDIV_DIV1) || ((__DIV__) == RCC_HSE_PREDIV_DIV2)) +#endif /* STM32F105xC || STM32F107xC || STM32F100xB || STM32F100xE */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +#define IS_RCC_PLL_MUL(__MUL__) (((__MUL__) == RCC_PLL_MUL4) || ((__MUL__) == RCC_PLL_MUL5) || \ + ((__MUL__) == RCC_PLL_MUL6) || ((__MUL__) == RCC_PLL_MUL7) || \ + ((__MUL__) == RCC_PLL_MUL8) || ((__MUL__) == RCC_PLL_MUL9) || \ + ((__MUL__) == RCC_PLL_MUL6_5)) + +#define IS_RCC_MCO1SOURCE(__SOURCE__) (((__SOURCE__) == RCC_MCO1SOURCE_SYSCLK) || ((__SOURCE__) == RCC_MCO1SOURCE_HSI) \ + || ((__SOURCE__) == RCC_MCO1SOURCE_HSE) || ((__SOURCE__) == RCC_MCO1SOURCE_PLLCLK) \ + || ((__SOURCE__) == RCC_MCO1SOURCE_PLL2CLK) || ((__SOURCE__) == RCC_MCO1SOURCE_PLL3CLK) \ + || ((__SOURCE__) == RCC_MCO1SOURCE_PLL3CLK_DIV2) || ((__SOURCE__) == RCC_MCO1SOURCE_EXT_HSE) \ + || ((__SOURCE__) == RCC_MCO1SOURCE_NOCLOCK)) + +#else +#define IS_RCC_PLL_MUL(__MUL__) (((__MUL__) == RCC_PLL_MUL2) || ((__MUL__) == RCC_PLL_MUL3) || \ + ((__MUL__) == RCC_PLL_MUL4) || ((__MUL__) == RCC_PLL_MUL5) || \ + ((__MUL__) == RCC_PLL_MUL6) || ((__MUL__) == RCC_PLL_MUL7) || \ + ((__MUL__) == RCC_PLL_MUL8) || ((__MUL__) == RCC_PLL_MUL9) || \ + ((__MUL__) == RCC_PLL_MUL10) || ((__MUL__) == RCC_PLL_MUL11) || \ + ((__MUL__) == RCC_PLL_MUL12) || ((__MUL__) == RCC_PLL_MUL13) || \ + ((__MUL__) == RCC_PLL_MUL14) || ((__MUL__) == RCC_PLL_MUL15) || \ + ((__MUL__) == RCC_PLL_MUL16)) + +#define IS_RCC_MCO1SOURCE(__SOURCE__) (((__SOURCE__) == RCC_MCO1SOURCE_SYSCLK) || ((__SOURCE__) == RCC_MCO1SOURCE_HSI) \ + || ((__SOURCE__) == RCC_MCO1SOURCE_HSE) || ((__SOURCE__) == RCC_MCO1SOURCE_PLLCLK) \ + || ((__SOURCE__) == RCC_MCO1SOURCE_NOCLOCK)) + +#endif /* STM32F105xC || STM32F107xC*/ + +#define IS_RCC_ADCPLLCLK_DIV(__ADCCLK__) (((__ADCCLK__) == RCC_ADCPCLK2_DIV2) || ((__ADCCLK__) == RCC_ADCPCLK2_DIV4) || \ + ((__ADCCLK__) == RCC_ADCPCLK2_DIV6) || ((__ADCCLK__) == RCC_ADCPCLK2_DIV8)) + +#if defined(STM32F105xC) || defined(STM32F107xC) +#define IS_RCC_I2S2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_I2S2CLKSOURCE_SYSCLK) || ((__SOURCE__) == RCC_I2S2CLKSOURCE_PLLI2S_VCO)) + +#define IS_RCC_I2S3CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_I2S3CLKSOURCE_SYSCLK) || ((__SOURCE__) == RCC_I2S3CLKSOURCE_PLLI2S_VCO)) + +#define IS_RCC_USBPLLCLK_DIV(__USBCLK__) (((__USBCLK__) == RCC_USBCLKSOURCE_PLL_DIV2) || ((__USBCLK__) == RCC_USBCLKSOURCE_PLL_DIV3)) + +#define IS_RCC_PLLI2S_MUL(__MUL__) (((__MUL__) == RCC_PLLI2S_MUL8) || ((__MUL__) == RCC_PLLI2S_MUL9) || \ + ((__MUL__) == RCC_PLLI2S_MUL10) || ((__MUL__) == RCC_PLLI2S_MUL11) || \ + ((__MUL__) == RCC_PLLI2S_MUL12) || ((__MUL__) == RCC_PLLI2S_MUL13) || \ + ((__MUL__) == RCC_PLLI2S_MUL14) || ((__MUL__) == RCC_PLLI2S_MUL16) || \ + ((__MUL__) == RCC_PLLI2S_MUL20)) + +#define IS_RCC_HSE_PREDIV2(__DIV__) (((__DIV__) == RCC_HSE_PREDIV2_DIV1) || ((__DIV__) == RCC_HSE_PREDIV2_DIV2) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV3) || ((__DIV__) == RCC_HSE_PREDIV2_DIV4) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV5) || ((__DIV__) == RCC_HSE_PREDIV2_DIV6) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV7) || ((__DIV__) == RCC_HSE_PREDIV2_DIV8) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV9) || ((__DIV__) == RCC_HSE_PREDIV2_DIV10) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV11) || ((__DIV__) == RCC_HSE_PREDIV2_DIV12) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV13) || ((__DIV__) == RCC_HSE_PREDIV2_DIV14) || \ + ((__DIV__) == RCC_HSE_PREDIV2_DIV15) || ((__DIV__) == RCC_HSE_PREDIV2_DIV16)) + +#define IS_RCC_PLL2(__PLL__) (((__PLL__) == RCC_PLL2_NONE) || ((__PLL__) == RCC_PLL2_OFF) || \ + ((__PLL__) == RCC_PLL2_ON)) + +#define IS_RCC_PLL2_MUL(__MUL__) (((__MUL__) == RCC_PLL2_MUL8) || ((__MUL__) == RCC_PLL2_MUL9) || \ + ((__MUL__) == RCC_PLL2_MUL10) || ((__MUL__) == RCC_PLL2_MUL11) || \ + ((__MUL__) == RCC_PLL2_MUL12) || ((__MUL__) == RCC_PLL2_MUL13) || \ + ((__MUL__) == RCC_PLL2_MUL14) || ((__MUL__) == RCC_PLL2_MUL16) || \ + ((__MUL__) == RCC_PLL2_MUL20)) + +#define IS_RCC_PERIPHCLOCK(__SELECTION__) \ + ((((__SELECTION__) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_I2S2) == RCC_PERIPHCLK_I2S2) || \ + (((__SELECTION__) & RCC_PERIPHCLK_I2S3) == RCC_PERIPHCLK_I2S3) || \ + (((__SELECTION__) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB)) + +#elif defined(STM32F103xE) || defined(STM32F103xG) + +#define IS_RCC_I2S2CLKSOURCE(__SOURCE__) ((__SOURCE__) == RCC_I2S2CLKSOURCE_SYSCLK) + +#define IS_RCC_I2S3CLKSOURCE(__SOURCE__) ((__SOURCE__) == RCC_I2S3CLKSOURCE_SYSCLK) + +#define IS_RCC_PERIPHCLOCK(__SELECTION__) \ + ((((__SELECTION__) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_I2S2) == RCC_PERIPHCLK_I2S2) || \ + (((__SELECTION__) & RCC_PERIPHCLK_I2S3) == RCC_PERIPHCLK_I2S3) || \ + (((__SELECTION__) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB)) + + +#elif defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) + +#define IS_RCC_PERIPHCLOCK(__SELECTION__) \ + ((((__SELECTION__) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB)) + +#else + +#define IS_RCC_PERIPHCLOCK(__SELECTION__) \ + ((((__SELECTION__) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC) || \ + (((__SELECTION__) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC)) + +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) + +#define IS_RCC_USBPLLCLK_DIV(__USBCLK__) (((__USBCLK__) == RCC_USBCLKSOURCE_PLL) || ((__USBCLK__) == RCC_USBCLKSOURCE_PLL_DIV1_5)) + +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ + +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup RCCEx_Exported_Types RCCEx Exported Types + * @{ + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** + * @brief RCC PLL2 configuration structure definition + */ +typedef struct +{ + uint32_t PLL2State; /*!< The new state of the PLL2. + This parameter can be a value of @ref RCCEx_PLL2_Config */ + + uint32_t PLL2MUL; /*!< PLL2MUL: Multiplication factor for PLL2 VCO input clock + This parameter must be a value of @ref RCCEx_PLL2_Multiplication_Factor*/ + +#if defined(STM32F105xC) || defined(STM32F107xC) + uint32_t HSEPrediv2Value; /*!< The Prediv2 factor value. + This parameter can be a value of @ref RCCEx_Prediv2_Factor */ + +#endif /* STM32F105xC || STM32F107xC */ +} RCC_PLL2InitTypeDef; + +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @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 */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + uint32_t Prediv1Source; /*!< The Prediv1 source value. + This parameter can be a value of @ref RCCEx_Prediv1_Source */ +#endif /* STM32F105xC || STM32F107xC */ + + uint32_t HSEState; /*!< The new state of the HSE. + This parameter can be a value of @ref RCC_HSE_Config */ + + uint32_t HSEPredivValue; /*!< The Prediv1 factor value (named PREDIV1 or PLLXTPRE in RM) + This parameter can be a value of @ref RCCEx_Prediv1_Factor */ + + 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 */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + RCC_PLL2InitTypeDef PLL2; /*!< PLL2 structure parameters */ +#endif /* STM32F105xC || STM32F107xC */ +} RCC_OscInitTypeDef; + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** + * @brief RCC PLLI2S configuration structure definition + */ +typedef struct +{ + uint32_t PLLI2SMUL; /*!< PLLI2SMUL: Multiplication factor for PLLI2S VCO input clock + This parameter must be a value of @ref RCCEx_PLLI2S_Multiplication_Factor*/ + +#if defined(STM32F105xC) || defined(STM32F107xC) + uint32_t HSEPrediv2Value; /*!< The Prediv2 factor value. + This parameter can be a value of @ref RCCEx_Prediv2_Factor */ + +#endif /* STM32F105xC || STM32F107xC */ +} RCC_PLLI2SInitTypeDef; +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @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 RTCClockSelection; /*!< specifies the RTC clock source. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t AdcClockSelection; /*!< ADC clock source + This parameter can be a value of @ref RCCEx_ADC_Prescaler */ + +#if defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC)\ + || defined(STM32F107xC) + uint32_t I2s2ClockSelection; /*!< I2S2 clock source + This parameter can be a value of @ref RCCEx_I2S2_Clock_Source */ + + uint32_t I2s3ClockSelection; /*!< I2S3 clock source + This parameter can be a value of @ref RCCEx_I2S3_Clock_Source */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters + This parameter will be used only when PLLI2S is selected as Clock Source I2S2 or I2S3 */ + +#endif /* STM32F105xC || STM32F107xC */ +#endif /* STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) + uint32_t UsbClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Prescaler */ + +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ +} RCC_PeriphCLKInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants + * @{ + */ + +/** @defgroup RCCEx_Periph_Clock_Selection Periph Clock Selection + * @{ + */ +#define RCC_PERIPHCLK_RTC 0x00000001U +#define RCC_PERIPHCLK_ADC 0x00000002U +#if defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE)\ + || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC) +#define RCC_PERIPHCLK_I2S2 0x00000004U +#define RCC_PERIPHCLK_I2S3 0x00000008U +#endif /* STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) +#define RCC_PERIPHCLK_USB 0x00000010U +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/** @defgroup RCCEx_ADC_Prescaler ADC Prescaler + * @{ + */ +#define RCC_ADCPCLK2_DIV2 RCC_CFGR_ADCPRE_DIV2 +#define RCC_ADCPCLK2_DIV4 RCC_CFGR_ADCPRE_DIV4 +#define RCC_ADCPCLK2_DIV6 RCC_CFGR_ADCPRE_DIV6 +#define RCC_ADCPCLK2_DIV8 RCC_CFGR_ADCPRE_DIV8 + +/** + * @} + */ + +#if defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC)\ + || defined(STM32F107xC) +/** @defgroup RCCEx_I2S2_Clock_Source I2S2 Clock Source + * @{ + */ +#define RCC_I2S2CLKSOURCE_SYSCLK 0x00000000U +#if defined(STM32F105xC) || defined(STM32F107xC) +#define RCC_I2S2CLKSOURCE_PLLI2S_VCO RCC_CFGR2_I2S2SRC +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/** @defgroup RCCEx_I2S3_Clock_Source I2S3 Clock Source + * @{ + */ +#define RCC_I2S3CLKSOURCE_SYSCLK 0x00000000U +#if defined(STM32F105xC) || defined(STM32F107xC) +#define RCC_I2S3CLKSOURCE_PLLI2S_VCO RCC_CFGR2_I2S3SRC +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +#endif /* STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) + +/** @defgroup RCCEx_USB_Prescaler USB Prescaler + * @{ + */ +#define RCC_USBCLKSOURCE_PLL RCC_CFGR_USBPRE +#define RCC_USBCLKSOURCE_PLL_DIV1_5 0x00000000U + +/** + * @} + */ + +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ + + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_USB_Prescaler USB Prescaler + * @{ + */ +#define RCC_USBCLKSOURCE_PLL_DIV2 RCC_CFGR_OTGFSPRE +#define RCC_USBCLKSOURCE_PLL_DIV3 0x00000000U + +/** + * @} + */ + +/** @defgroup RCCEx_PLLI2S_Multiplication_Factor PLLI2S Multiplication Factor + * @{ + */ + +#define RCC_PLLI2S_MUL8 RCC_CFGR2_PLL3MUL8 /*!< PLLI2S input clock * 8 */ +#define RCC_PLLI2S_MUL9 RCC_CFGR2_PLL3MUL9 /*!< PLLI2S input clock * 9 */ +#define RCC_PLLI2S_MUL10 RCC_CFGR2_PLL3MUL10 /*!< PLLI2S input clock * 10 */ +#define RCC_PLLI2S_MUL11 RCC_CFGR2_PLL3MUL11 /*!< PLLI2S input clock * 11 */ +#define RCC_PLLI2S_MUL12 RCC_CFGR2_PLL3MUL12 /*!< PLLI2S input clock * 12 */ +#define RCC_PLLI2S_MUL13 RCC_CFGR2_PLL3MUL13 /*!< PLLI2S input clock * 13 */ +#define RCC_PLLI2S_MUL14 RCC_CFGR2_PLL3MUL14 /*!< PLLI2S input clock * 14 */ +#define RCC_PLLI2S_MUL16 RCC_CFGR2_PLL3MUL16 /*!< PLLI2S input clock * 16 */ +#define RCC_PLLI2S_MUL20 RCC_CFGR2_PLL3MUL20 /*!< PLLI2S input clock * 20 */ + +/** + * @} + */ +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_Prediv1_Source Prediv1 Source + * @{ + */ + +#define RCC_PREDIV1_SOURCE_HSE RCC_CFGR2_PREDIV1SRC_HSE +#define RCC_PREDIV1_SOURCE_PLL2 RCC_CFGR2_PREDIV1SRC_PLL2 + +/** + * @} + */ +#endif /* STM32F105xC || STM32F107xC */ + +/** @defgroup RCCEx_Prediv1_Factor HSE Prediv1 Factor + * @{ + */ + +#define RCC_HSE_PREDIV_DIV1 0x00000000U + +#if defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F100xB)\ + || defined(STM32F100xE) +#define RCC_HSE_PREDIV_DIV2 RCC_CFGR2_PREDIV1_DIV2 +#define RCC_HSE_PREDIV_DIV3 RCC_CFGR2_PREDIV1_DIV3 +#define RCC_HSE_PREDIV_DIV4 RCC_CFGR2_PREDIV1_DIV4 +#define RCC_HSE_PREDIV_DIV5 RCC_CFGR2_PREDIV1_DIV5 +#define RCC_HSE_PREDIV_DIV6 RCC_CFGR2_PREDIV1_DIV6 +#define RCC_HSE_PREDIV_DIV7 RCC_CFGR2_PREDIV1_DIV7 +#define RCC_HSE_PREDIV_DIV8 RCC_CFGR2_PREDIV1_DIV8 +#define RCC_HSE_PREDIV_DIV9 RCC_CFGR2_PREDIV1_DIV9 +#define RCC_HSE_PREDIV_DIV10 RCC_CFGR2_PREDIV1_DIV10 +#define RCC_HSE_PREDIV_DIV11 RCC_CFGR2_PREDIV1_DIV11 +#define RCC_HSE_PREDIV_DIV12 RCC_CFGR2_PREDIV1_DIV12 +#define RCC_HSE_PREDIV_DIV13 RCC_CFGR2_PREDIV1_DIV13 +#define RCC_HSE_PREDIV_DIV14 RCC_CFGR2_PREDIV1_DIV14 +#define RCC_HSE_PREDIV_DIV15 RCC_CFGR2_PREDIV1_DIV15 +#define RCC_HSE_PREDIV_DIV16 RCC_CFGR2_PREDIV1_DIV16 +#else +#define RCC_HSE_PREDIV_DIV2 RCC_CFGR_PLLXTPRE +#endif /* STM32F105xC || STM32F107xC || STM32F100xB || STM32F100xE */ + +/** + * @} + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_Prediv2_Factor HSE Prediv2 Factor + * @{ + */ + +#define RCC_HSE_PREDIV2_DIV1 RCC_CFGR2_PREDIV2_DIV1 /*!< PREDIV2 input clock not divided */ +#define RCC_HSE_PREDIV2_DIV2 RCC_CFGR2_PREDIV2_DIV2 /*!< PREDIV2 input clock divided by 2 */ +#define RCC_HSE_PREDIV2_DIV3 RCC_CFGR2_PREDIV2_DIV3 /*!< PREDIV2 input clock divided by 3 */ +#define RCC_HSE_PREDIV2_DIV4 RCC_CFGR2_PREDIV2_DIV4 /*!< PREDIV2 input clock divided by 4 */ +#define RCC_HSE_PREDIV2_DIV5 RCC_CFGR2_PREDIV2_DIV5 /*!< PREDIV2 input clock divided by 5 */ +#define RCC_HSE_PREDIV2_DIV6 RCC_CFGR2_PREDIV2_DIV6 /*!< PREDIV2 input clock divided by 6 */ +#define RCC_HSE_PREDIV2_DIV7 RCC_CFGR2_PREDIV2_DIV7 /*!< PREDIV2 input clock divided by 7 */ +#define RCC_HSE_PREDIV2_DIV8 RCC_CFGR2_PREDIV2_DIV8 /*!< PREDIV2 input clock divided by 8 */ +#define RCC_HSE_PREDIV2_DIV9 RCC_CFGR2_PREDIV2_DIV9 /*!< PREDIV2 input clock divided by 9 */ +#define RCC_HSE_PREDIV2_DIV10 RCC_CFGR2_PREDIV2_DIV10 /*!< PREDIV2 input clock divided by 10 */ +#define RCC_HSE_PREDIV2_DIV11 RCC_CFGR2_PREDIV2_DIV11 /*!< PREDIV2 input clock divided by 11 */ +#define RCC_HSE_PREDIV2_DIV12 RCC_CFGR2_PREDIV2_DIV12 /*!< PREDIV2 input clock divided by 12 */ +#define RCC_HSE_PREDIV2_DIV13 RCC_CFGR2_PREDIV2_DIV13 /*!< PREDIV2 input clock divided by 13 */ +#define RCC_HSE_PREDIV2_DIV14 RCC_CFGR2_PREDIV2_DIV14 /*!< PREDIV2 input clock divided by 14 */ +#define RCC_HSE_PREDIV2_DIV15 RCC_CFGR2_PREDIV2_DIV15 /*!< PREDIV2 input clock divided by 15 */ +#define RCC_HSE_PREDIV2_DIV16 RCC_CFGR2_PREDIV2_DIV16 /*!< PREDIV2 input clock divided by 16 */ + +/** + * @} + */ + +/** @defgroup RCCEx_PLL2_Config PLL Config + * @{ + */ +#define RCC_PLL2_NONE 0x00000000U +#define RCC_PLL2_OFF 0x00000001U +#define RCC_PLL2_ON 0x00000002U + +/** + * @} + */ + +/** @defgroup RCCEx_PLL2_Multiplication_Factor PLL2 Multiplication Factor + * @{ + */ + +#define RCC_PLL2_MUL8 RCC_CFGR2_PLL2MUL8 /*!< PLL2 input clock * 8 */ +#define RCC_PLL2_MUL9 RCC_CFGR2_PLL2MUL9 /*!< PLL2 input clock * 9 */ +#define RCC_PLL2_MUL10 RCC_CFGR2_PLL2MUL10 /*!< PLL2 input clock * 10 */ +#define RCC_PLL2_MUL11 RCC_CFGR2_PLL2MUL11 /*!< PLL2 input clock * 11 */ +#define RCC_PLL2_MUL12 RCC_CFGR2_PLL2MUL12 /*!< PLL2 input clock * 12 */ +#define RCC_PLL2_MUL13 RCC_CFGR2_PLL2MUL13 /*!< PLL2 input clock * 13 */ +#define RCC_PLL2_MUL14 RCC_CFGR2_PLL2MUL14 /*!< PLL2 input clock * 14 */ +#define RCC_PLL2_MUL16 RCC_CFGR2_PLL2MUL16 /*!< PLL2 input clock * 16 */ +#define RCC_PLL2_MUL20 RCC_CFGR2_PLL2MUL20 /*!< PLL2 input clock * 20 */ + +/** + * @} + */ + +#endif /* STM32F105xC || STM32F107xC */ + +/** @defgroup RCCEx_PLL_Multiplication_Factor PLL Multiplication Factor + * @{ + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +#else +#define RCC_PLL_MUL2 RCC_CFGR_PLLMULL2 +#define RCC_PLL_MUL3 RCC_CFGR_PLLMULL3 +#endif /* STM32F105xC || STM32F107xC */ +#define RCC_PLL_MUL4 RCC_CFGR_PLLMULL4 +#define RCC_PLL_MUL5 RCC_CFGR_PLLMULL5 +#define RCC_PLL_MUL6 RCC_CFGR_PLLMULL6 +#define RCC_PLL_MUL7 RCC_CFGR_PLLMULL7 +#define RCC_PLL_MUL8 RCC_CFGR_PLLMULL8 +#define RCC_PLL_MUL9 RCC_CFGR_PLLMULL9 +#if defined(STM32F105xC) || defined(STM32F107xC) +#define RCC_PLL_MUL6_5 RCC_CFGR_PLLMULL6_5 +#else +#define RCC_PLL_MUL10 RCC_CFGR_PLLMULL10 +#define RCC_PLL_MUL11 RCC_CFGR_PLLMULL11 +#define RCC_PLL_MUL12 RCC_CFGR_PLLMULL12 +#define RCC_PLL_MUL13 RCC_CFGR_PLLMULL13 +#define RCC_PLL_MUL14 RCC_CFGR_PLLMULL14 +#define RCC_PLL_MUL15 RCC_CFGR_PLLMULL15 +#define RCC_PLL_MUL16 RCC_CFGR_PLLMULL16 +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/** @defgroup RCCEx_MCO1_Clock_Source MCO1 Clock Source + * @{ + */ +#define RCC_MCO1SOURCE_NOCLOCK ((uint32_t)RCC_CFGR_MCO_NOCLOCK) +#define RCC_MCO1SOURCE_SYSCLK ((uint32_t)RCC_CFGR_MCO_SYSCLK) +#define RCC_MCO1SOURCE_HSI ((uint32_t)RCC_CFGR_MCO_HSI) +#define RCC_MCO1SOURCE_HSE ((uint32_t)RCC_CFGR_MCO_HSE) +#define RCC_MCO1SOURCE_PLLCLK ((uint32_t)RCC_CFGR_MCO_PLLCLK_DIV2) +#if defined(STM32F105xC) || defined(STM32F107xC) +#define RCC_MCO1SOURCE_PLL2CLK ((uint32_t)RCC_CFGR_MCO_PLL2CLK) +#define RCC_MCO1SOURCE_PLL3CLK_DIV2 ((uint32_t)RCC_CFGR_MCO_PLL3CLK_DIV2) +#define RCC_MCO1SOURCE_EXT_HSE ((uint32_t)RCC_CFGR_MCO_EXT_HSE) +#define RCC_MCO1SOURCE_PLL3CLK ((uint32_t)RCC_CFGR_MCO_PLL3CLK) +#endif /* STM32F105xC || STM32F107xC*/ +/** + * @} + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_Interrupt RCCEx Interrupt + * @{ + */ +#define RCC_IT_PLL2RDY ((uint8_t)RCC_CIR_PLL2RDYF) +#define RCC_IT_PLLI2SRDY ((uint8_t)RCC_CIR_PLL3RDYF) +/** + * @} + */ + +/** @defgroup RCCEx_Flag RCCEx Flag + * Elements values convention: 0XXYYYYYb + * - YYYYY : Flag position in the register + * - XX : Register index + * - 01: CR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_PLL2RDY ((uint8_t)((CR_REG_INDEX << 5U) | RCC_CR_PLL2RDY_Pos)) +#define RCC_FLAG_PLLI2SRDY ((uint8_t)((CR_REG_INDEX << 5U) | RCC_CR_PLL3RDY_Pos)) +/** + * @} + */ +#endif /* STM32F105xC || STM32F107xC*/ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Macros RCCEx Exported Macros + * @{ + */ + +/** @defgroup RCCEx_Peripheral_Clock_Enable_Disable 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. + * @{ + */ + +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined(STM32F105xC) || defined (STM32F107xC)\ + || defined (STM32F100xE) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_DMA2EN)) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG || STM32F105xC || STM32F107xC || STM32F100xE */ + +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined (STM32F100xE) +#define __HAL_RCC_FSMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FSMC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_FSMCEN)) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG || STM32F100xE */ + +#if defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) + + +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_SDIOEN)) +#endif /* STM32F103xE || STM32F103xG */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_USB_OTG_FS_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_OTGFSEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_OTGFSEN);\ + UNUSED(tmpreg); \ + } while(0U) + + +#define __HAL_RCC_USB_OTG_FS_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_OTGFSEN)) +#endif /* STM32F105xC || STM32F107xC*/ + +#if defined(STM32F107xC) +#define __HAL_RCC_ETHMAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ETHMACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ETHMACEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_ETHMACTX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ETHMACTXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ETHMACTXEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_ETHMACRX_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ETHMACRXEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ETHMACRXEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_ETHMAC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ETHMACEN)) +#define __HAL_RCC_ETHMACTX_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ETHMACTXEN)) +#define __HAL_RCC_ETHMACRX_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ETHMACRXEN)) + +/** + * @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) + +#endif /* STM32F107xC*/ + +/** + * @} + */ + +/** @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(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined(STM32F105xC) || defined (STM32F107xC)\ + || defined (STM32F100xE) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA2EN)) != RESET) +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA2EN)) == RESET) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG || STM32F105xC || STM32F107xC || STM32F100xE */ +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined (STM32F100xE) +#define __HAL_RCC_FSMC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_FSMCEN)) != RESET) +#define __HAL_RCC_FSMC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_FSMCEN)) == RESET) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG || STM32F100xE */ +#if defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_SDIOEN)) != RESET) +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_SDIOEN)) == RESET) +#endif /* STM32F103xE || STM32F103xG */ +#if defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_OTGFSEN)) != RESET) +#define __HAL_RCC_USB_OTG_FS_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_OTGFSEN)) == RESET) +#endif /* STM32F105xC || STM32F107xC*/ +#if defined(STM32F107xC) +#define __HAL_RCC_ETHMAC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ETHMACEN)) != RESET) +#define __HAL_RCC_ETHMAC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ETHMACEN)) == RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ETHMACTXEN)) != RESET) +#define __HAL_RCC_ETHMACTX_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ETHMACTXEN)) == RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ETHMACRXEN)) != RESET) +#define __HAL_RCC_ETHMACRX_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ETHMACRXEN)) == RESET) +#endif /* STM32F107xC*/ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable APB1 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. + * @{ + */ + +#if defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE)\ + || defined(STM32F103xG) || defined(STM32F105xC) ||defined(STM32F107xC) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#endif /* STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + +#if defined(STM32F100xB) || defined(STM32F100xE) || defined(STM32F101xB)\ + || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F102xB)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#endif /* STM32F100xB || STM32F101xB || STM32F101xE || (...) || STM32F105xC || STM32F107xC */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_USB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USBEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_USB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USBEN)) +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ + +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#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_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#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_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || (...) || STM32F105xC || STM32F107xC */ + +#if defined(STM32F100xB) || defined (STM32F100xE) +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_CEC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) +#endif /* STM32F100xB || STM32F100xE */ + +#ifdef STM32F100xE +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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; \ + 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_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#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_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#endif /* STM32F100xE */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F101xG) || defined(STM32F103xG) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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; \ + 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; \ + 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_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)) +#endif /* STM32F101xG || STM32F103xG*/ + +/** + * @} + */ + +/** @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. + * @{ + */ + +#if defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE)\ + || defined(STM32F103xG) || defined(STM32F105xC) ||defined(STM32F107xC) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#endif /* STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ +#if defined(STM32F100xB) || defined(STM32F100xE) || defined(STM32F101xB)\ + || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F102xB)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#endif /* STM32F100xB || STM32F101xB || STM32F101xE || (...) || STM32F105xC || STM32F107xC */ +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_USB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USBEN)) != RESET) +#define __HAL_RCC_USB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USBEN)) == RESET) +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) +#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || (...) || STM32F105xC || STM32F107xC */ +#if defined(STM32F100xB) || defined (STM32F100xE) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != RESET) +#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) +#endif /* STM32F100xB || STM32F100xE */ +#ifdef STM32F100xE +#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) +#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#endif /* STM32F100xE */ +#if defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#endif /* STM32F105xC || STM32F107xC */ +#if defined(STM32F101xG) || defined(STM32F103xG) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#endif /* STM32F101xG || STM32F103xG*/ + +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 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. + * @{ + */ + +#if defined(STM32F101xG) || defined(STM32F103x6) || defined(STM32F103xB)\ + || defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F103xE)\ + || defined(STM32F103xG) +#define __HAL_RCC_ADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_ADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC2EN)) +#endif /* STM32F101xG || STM32F103x6 || STM32F103xB || STM32F105xC || STM32F107xC || STM32F103xE || STM32F103xG */ + +#if defined(STM32F100xB) || defined(STM32F100xE) +#define __HAL_RCC_TIM15_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM16_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM17_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM15_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM15EN)) +#define __HAL_RCC_TIM16_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM16EN)) +#define __HAL_RCC_TIM17_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM17EN)) +#endif /* STM32F100xB || STM32F100xE */ + +#if defined(STM32F100xE) || defined(STM32F101xB) || defined(STM32F101xE)\ + || defined(STM32F101xG) || defined(STM32F100xB) || defined(STM32F103xB)\ + || defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC)\ + || defined(STM32F107xC) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPEEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPEEN)) +#endif /* STM32F101x6 || STM32F101xB || STM32F101xE || (...) || STM32F105xC || STM32F107xC */ + +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPFEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPGEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPGEN)) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG*/ + +#if defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_ADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#define __HAL_RCC_ADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC3EN)) +#endif /* STM32F103xE || STM32F103xG */ + +#if defined(STM32F100xE) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPFEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPGEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPFEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_IOPGEN)) +#endif /* STM32F100xE */ + +#if defined(STM32F101xG) || defined(STM32F103xG) +#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM11_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) +#endif /* STM32F101xG || STM32F103xG */ + +/** + * @} + */ + +/** @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. + * @{ + */ + +#if defined(STM32F101xG) || defined(STM32F103x6) || defined(STM32F103xB)\ + || defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F103xE)\ + || defined(STM32F103xG) +#define __HAL_RCC_ADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) != RESET) +#define __HAL_RCC_ADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC2EN)) == RESET) +#endif /* STM32F101xG || STM32F103x6 || STM32F103xB || STM32F105xC || STM32F107xC || STM32F103xE || STM32F103xG */ +#if defined(STM32F100xB) || defined(STM32F100xE) +#define __HAL_RCC_TIM15_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM15EN)) != RESET) +#define __HAL_RCC_TIM15_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM15EN)) == RESET) +#define __HAL_RCC_TIM16_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM16EN)) != RESET) +#define __HAL_RCC_TIM16_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM16EN)) == RESET) +#define __HAL_RCC_TIM17_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM17EN)) != RESET) +#define __HAL_RCC_TIM17_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM17EN)) == RESET) +#endif /* STM32F100xB || STM32F100xE */ +#if defined(STM32F100xE) || defined(STM32F101xB) || defined(STM32F101xE)\ + || defined(STM32F101xG) || defined(STM32F100xB) || defined(STM32F103xB)\ + || defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC)\ + || defined(STM32F107xC) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPEEN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPEEN)) == RESET) +#endif /* STM32F101x6 || STM32F101xB || STM32F101xE || (...) || STM32F105xC || STM32F107xC */ +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPFEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPGEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPGEN)) == RESET) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG*/ +#if defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#define __HAL_RCC_ADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) != RESET) +#define __HAL_RCC_ADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC3EN)) == RESET) +#endif /* STM32F103xE || STM32F103xG */ +#if defined(STM32F100xE) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPFEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPFEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPGEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_IOPGEN)) == RESET) +#endif /* STM32F100xE */ +#if defined(STM32F101xG) || defined(STM32F103xG) +#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) +#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) +#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) +#endif /* STM32F101xG || STM32F103xG */ + +/** + * @} + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_Peripheral_Clock_Force_Release Peripheral Clock Force Release + * @brief Force or release AHB peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB_FORCE_RESET() (RCC->AHBRSTR = 0xFFFFFFFFU) +#define __HAL_RCC_USB_OTG_FS_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_OTGFSRST)) +#if defined(STM32F107xC) +#define __HAL_RCC_ETHMAC_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_ETHMACRST)) +#endif /* STM32F107xC */ + +#define __HAL_RCC_AHB_RELEASE_RESET() (RCC->AHBRSTR = 0x00) +#define __HAL_RCC_USB_OTG_FS_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_OTGFSRST)) +#if defined(STM32F107xC) +#define __HAL_RCC_ETHMAC_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_ETHMACRST)) +#endif /* STM32F107xC */ + +/** + * @} + */ +#endif /* STM32F105xC || STM32F107xC */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ + +#if defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE)\ + || defined(STM32F103xG) || defined(STM32F105xC) ||defined(STM32F107xC) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) + +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#endif /* STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + +#if defined(STM32F100xB) || defined(STM32F100xE) || defined(STM32F101xB)\ + || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F102xB)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) + +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#endif /* STM32F100xB || STM32F101xB || STM32F101xE || (...) || STM32F105xC || STM32F107xC */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_USB_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USBRST)) +#define __HAL_RCC_USB_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USBRST)) +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ + +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) +#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_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#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_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) + +#define __HAL_RCC_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) +#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_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#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_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || (...) || STM32F105xC || STM32F107xC */ + +#if defined(STM32F100xB) || defined (STM32F100xE) +#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_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) + +#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_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) +#endif /* STM32F100xB || STM32F100xE */ + +#if defined (STM32F100xE) +#define __HAL_RCC_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) +#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_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#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_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) +#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_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#endif /* STM32F100xE */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) + +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F101xG) || defined(STM32F103xG) +#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_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)) +#endif /* STM32F101xG || STM32F103xG */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ + +#if defined(STM32F101xG) || defined(STM32F103x6) || defined(STM32F103xB)\ + || defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F103xE)\ + || defined(STM32F103xG) +#define __HAL_RCC_ADC2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADC2RST)) + +#define __HAL_RCC_ADC2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADC2RST)) +#endif /* STM32F101xG || STM32F103x6 || STM32F103xB || STM32F105xC || STM32F107xC || STM32F103xE || STM32F103xG */ + +#if defined(STM32F100xB) || defined(STM32F100xE) +#define __HAL_RCC_TIM15_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM15RST)) +#define __HAL_RCC_TIM16_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM16RST)) +#define __HAL_RCC_TIM17_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM17RST)) + +#define __HAL_RCC_TIM15_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM15RST)) +#define __HAL_RCC_TIM16_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM16RST)) +#define __HAL_RCC_TIM17_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM17RST)) +#endif /* STM32F100xB || STM32F100xE */ + +#if defined(STM32F100xE) || defined(STM32F101xB) || defined(STM32F101xE)\ + || defined(STM32F101xG) || defined(STM32F100xB) || defined(STM32F103xB)\ + || defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC)\ + || defined(STM32F107xC) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPERST)) + +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPERST)) +#endif /* STM32F101x6 || STM32F101xB || STM32F101xE || (...) || STM32F105xC || STM32F107xC */ + +#if defined(STM32F101xE) || defined(STM32F103xE) || defined(STM32F101xG)\ + || defined(STM32F103xG) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPGRST)) + +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPGRST)) +#endif /* STM32F101xE || STM32F103xE || STM32F101xG || STM32F103xG*/ + +#if defined(STM32F103xE) || defined(STM32F103xG) +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_ADC3_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADC3RST)) + +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#define __HAL_RCC_ADC3_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADC3RST)) +#endif /* STM32F103xE || STM32F103xG */ + +#if defined(STM32F100xE) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPFRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_IOPGRST)) + +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPFRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_IOPGRST)) +#endif /* STM32F100xE */ + +#if defined(STM32F101xG) || defined(STM32F103xG) +#define __HAL_RCC_TIM9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM11_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM11RST)) + +#define __HAL_RCC_TIM9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM9RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_TIM11_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM11RST)) +#endif /* STM32F101xG || STM32F103xG*/ + +/** + * @} + */ + +/** @defgroup RCCEx_HSE_Configuration HSE Configuration + * @{ + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F100xB)\ + || defined(STM32F100xE) +/** + * @brief Macro to configure the External High Speed oscillator (HSE) Predivision factor for PLL. + * @note Predivision factor can not be changed if PLL is used as system clock + * In this case, you have to select another source of the system clock, disable the PLL and + * then change the HSE predivision factor. + * @param __HSE_PREDIV_VALUE__ specifies the division value applied to HSE. + * This parameter must be a number between RCC_HSE_PREDIV_DIV1 and RCC_HSE_PREDIV_DIV16. + */ +#define __HAL_RCC_HSE_PREDIV_CONFIG(__HSE_PREDIV_VALUE__) MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV1, (uint32_t)(__HSE_PREDIV_VALUE__)) +#else +/** + * @brief Macro to configure the External High Speed oscillator (HSE) Predivision factor for PLL. + * @note Predivision factor can not be changed if PLL is used as system clock + * In this case, you have to select another source of the system clock, disable the PLL and + * then change the HSE predivision factor. + * @param __HSE_PREDIV_VALUE__ specifies the division value applied to HSE. + * This parameter must be a number between RCC_HSE_PREDIV_DIV1 and RCC_HSE_PREDIV_DIV2. + */ +#define __HAL_RCC_HSE_PREDIV_CONFIG(__HSE_PREDIV_VALUE__) \ + MODIFY_REG(RCC->CFGR,RCC_CFGR_PLLXTPRE, (uint32_t)(__HSE_PREDIV_VALUE__)) + +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F100xB)\ + || defined(STM32F100xE) +/** + * @brief Macro to get prediv1 factor for PLL. + */ +#define __HAL_RCC_HSE_GET_PREDIV() READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1) + +#else +/** + * @brief Macro to get prediv1 factor for PLL. + */ +#define __HAL_RCC_HSE_GET_PREDIV() READ_BIT(RCC->CFGR, RCC_CFGR_PLLXTPRE) + +#endif /* STM32F105xC || STM32F107xC || STM32F100xB || STM32F100xE */ + +/** + * @} + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_PLLI2S_Configuration PLLI2S Configuration + * @{ + */ + +/** @brief Macros to enable the main PLLI2S. + * @note After enabling the main PLLI2S, the application software should wait on + * PLLI2SRDY flag to be set indicating that PLLI2S clock is stable and can + * be used as system clock source. + * @note The main PLLI2S is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) + +/** @brief Macros to disable the main PLLI2S. + * @note The main PLLI2S is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) + +/** @brief macros to configure the main PLLI2S multiplication factor. + * @note This function must be used only when the main PLLI2S is disabled. + * + * @param __PLLI2SMUL__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter can be one of the following values: + * @arg @ref RCC_PLLI2S_MUL8 PLLI2SVCO = PLLI2S clock entry x 8 + * @arg @ref RCC_PLLI2S_MUL9 PLLI2SVCO = PLLI2S clock entry x 9 + * @arg @ref RCC_PLLI2S_MUL10 PLLI2SVCO = PLLI2S clock entry x 10 + * @arg @ref RCC_PLLI2S_MUL11 PLLI2SVCO = PLLI2S clock entry x 11 + * @arg @ref RCC_PLLI2S_MUL12 PLLI2SVCO = PLLI2S clock entry x 12 + * @arg @ref RCC_PLLI2S_MUL13 PLLI2SVCO = PLLI2S clock entry x 13 + * @arg @ref RCC_PLLI2S_MUL14 PLLI2SVCO = PLLI2S clock entry x 14 + * @arg @ref RCC_PLLI2S_MUL16 PLLI2SVCO = PLLI2S clock entry x 16 + * @arg @ref RCC_PLLI2S_MUL20 PLLI2SVCO = PLLI2S clock entry x 20 + * + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SMUL__)\ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PLL3MUL,(__PLLI2SMUL__)) + +/** + * @} + */ + +#endif /* STM32F105xC || STM32F107xC */ + +/** @defgroup RCCEx_Peripheral_Configuration Peripheral Configuration + * @brief Macros to configure clock source of different peripherals. + * @{ + */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) +/** @brief Macro to configure the USB clock. + * @param __USBCLKSOURCE__ specifies the USB clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_USBCLKSOURCE_PLL PLL clock divided by 1 selected as USB clock + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV1_5 PLL clock divided by 1.5 selected as USB clock + */ +#define __HAL_RCC_USB_CONFIG(__USBCLKSOURCE__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_USBPRE, (uint32_t)(__USBCLKSOURCE__)) + +/** @brief Macro to get the USB clock (USBCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_USBCLKSOURCE_PLL PLL clock divided by 1 selected as USB clock + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV1_5 PLL clock divided by 1.5 selected as USB clock + */ +#define __HAL_RCC_GET_USB_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_USBPRE))) + +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + +/** @brief Macro to configure the USB OTSclock. + * @param __USBCLKSOURCE__ specifies the USB clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV2 PLL clock divided by 2 selected as USB OTG FS clock + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV3 PLL clock divided by 3 selected as USB OTG FS clock + */ +#define __HAL_RCC_USB_CONFIG(__USBCLKSOURCE__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_OTGFSPRE, (uint32_t)(__USBCLKSOURCE__)) + +/** @brief Macro to get the USB clock (USBCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV2 PLL clock divided by 2 selected as USB OTG FS clock + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV3 PLL clock divided by 3 selected as USB OTG FS clock + */ +#define __HAL_RCC_GET_USB_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_OTGFSPRE))) + +#endif /* STM32F105xC || STM32F107xC */ + +/** @brief Macro to configure the ADCx clock (x=1 to 3 depending on devices). + * @param __ADCCLKSOURCE__ specifies the ADC clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_ADCPCLK2_DIV2 PCLK2 clock divided by 2 selected as ADC clock + * @arg @ref RCC_ADCPCLK2_DIV4 PCLK2 clock divided by 4 selected as ADC clock + * @arg @ref RCC_ADCPCLK2_DIV6 PCLK2 clock divided by 6 selected as ADC clock + * @arg @ref RCC_ADCPCLK2_DIV8 PCLK2 clock divided by 8 selected as ADC clock + */ +#define __HAL_RCC_ADC_CONFIG(__ADCCLKSOURCE__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_ADCPRE, (uint32_t)(__ADCCLKSOURCE__)) + +/** @brief Macro to get the ADC clock (ADCxCLK, x=1 to 3 depending on devices). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_ADCPCLK2_DIV2 PCLK2 clock divided by 2 selected as ADC clock + * @arg @ref RCC_ADCPCLK2_DIV4 PCLK2 clock divided by 4 selected as ADC clock + * @arg @ref RCC_ADCPCLK2_DIV6 PCLK2 clock divided by 6 selected as ADC clock + * @arg @ref RCC_ADCPCLK2_DIV8 PCLK2 clock divided by 8 selected as ADC clock + */ +#define __HAL_RCC_GET_ADC_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_ADCPRE))) + +/** + * @} + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + +/** @addtogroup RCCEx_HSE_Configuration + * @{ + */ + +/** + * @brief Macro to configure the PLL2 & PLLI2S Predivision factor. + * @note Predivision factor can not be changed if PLL2 is used indirectly as system clock + * In this case, you have to select another source of the system clock, disable the PLL2 and PLLI2S and + * then change the PREDIV2 factor. + * @param __HSE_PREDIV2_VALUE__ specifies the PREDIV2 value applied to PLL2 & PLLI2S. + * This parameter must be a number between RCC_HSE_PREDIV2_DIV1 and RCC_HSE_PREDIV2_DIV16. + */ +#define __HAL_RCC_HSE_PREDIV2_CONFIG(__HSE_PREDIV2_VALUE__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV2, (uint32_t)(__HSE_PREDIV2_VALUE__)) + +/** + * @brief Macro to get prediv2 factor for PLL2 & PLL3. + */ +#define __HAL_RCC_HSE_GET_PREDIV2() READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV2) + +/** + * @} + */ + +/** @addtogroup RCCEx_PLLI2S_Configuration + * @{ + */ + +/** @brief Macros to enable the main PLL2. + * @note After enabling the main PLL2, the application software should wait on + * PLL2RDY flag to be set indicating that PLL2 clock is stable and can + * be used as system clock source. + * @note The main PLL2 is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL2_ENABLE() (*(__IO uint32_t *) RCC_CR_PLL2ON_BB = ENABLE) + +/** @brief Macros to disable the main PLL2. + * @note The main PLL2 can not be disabled if it is used indirectly as system clock source + * @note The main PLL2 is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL2_DISABLE() (*(__IO uint32_t *) RCC_CR_PLL2ON_BB = DISABLE) + +/** @brief macros to configure the main PLL2 multiplication factor. + * @note This function must be used only when the main PLL2 is disabled. + * + * @param __PLL2MUL__ specifies the multiplication factor for PLL2 VCO output clock + * This parameter can be one of the following values: + * @arg @ref RCC_PLL2_MUL8 PLL2VCO = PLL2 clock entry x 8 + * @arg @ref RCC_PLL2_MUL9 PLL2VCO = PLL2 clock entry x 9 + * @arg @ref RCC_PLL2_MUL10 PLL2VCO = PLL2 clock entry x 10 + * @arg @ref RCC_PLL2_MUL11 PLL2VCO = PLL2 clock entry x 11 + * @arg @ref RCC_PLL2_MUL12 PLL2VCO = PLL2 clock entry x 12 + * @arg @ref RCC_PLL2_MUL13 PLL2VCO = PLL2 clock entry x 13 + * @arg @ref RCC_PLL2_MUL14 PLL2VCO = PLL2 clock entry x 14 + * @arg @ref RCC_PLL2_MUL16 PLL2VCO = PLL2 clock entry x 16 + * @arg @ref RCC_PLL2_MUL20 PLL2VCO = PLL2 clock entry x 20 + * + */ +#define __HAL_RCC_PLL2_CONFIG(__PLL2MUL__)\ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PLL2MUL,(__PLL2MUL__)) + +/** + * @} + */ + +/** @defgroup RCCEx_I2S_Configuration I2S Configuration + * @brief Macros to configure clock source of I2S peripherals. + * @{ + */ + +/** @brief Macro to configure the I2S2 clock. + * @param __I2S2CLKSOURCE__ specifies the I2S2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2S2CLKSOURCE_SYSCLK system clock selected as I2S3 clock entry + * @arg @ref RCC_I2S2CLKSOURCE_PLLI2S_VCO PLLI2S VCO clock selected as I2S3 clock entry + */ +#define __HAL_RCC_I2S2_CONFIG(__I2S2CLKSOURCE__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_I2S2SRC, (uint32_t)(__I2S2CLKSOURCE__)) + +/** @brief Macro to get the I2S2 clock (I2S2CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2S2CLKSOURCE_SYSCLK system clock selected as I2S3 clock entry + * @arg @ref RCC_I2S2CLKSOURCE_PLLI2S_VCO PLLI2S VCO clock selected as I2S3 clock entry + */ +#define __HAL_RCC_GET_I2S2_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_I2S2SRC))) + +/** @brief Macro to configure the I2S3 clock. + * @param __I2S2CLKSOURCE__ specifies the I2S3 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2S3CLKSOURCE_SYSCLK system clock selected as I2S3 clock entry + * @arg @ref RCC_I2S3CLKSOURCE_PLLI2S_VCO PLLI2S VCO clock selected as I2S3 clock entry + */ +#define __HAL_RCC_I2S3_CONFIG(__I2S2CLKSOURCE__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_I2S3SRC, (uint32_t)(__I2S2CLKSOURCE__)) + +/** @brief Macro to get the I2S3 clock (I2S3CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2S3CLKSOURCE_SYSCLK system clock selected as I2S3 clock entry + * @arg @ref RCC_I2S3CLKSOURCE_PLLI2S_VCO PLLI2S VCO clock selected as I2S3 clock entry + */ +#define __HAL_RCC_GET_I2S3_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_I2S3SRC))) + +/** + * @} + */ + +#endif /* STM32F105xC || STM32F107xC */ +/** + * @} + */ + +/* 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(STM32F105xC) || defined(STM32F107xC) +/** @addtogroup RCCEx_Exported_Functions_Group2 + * @{ + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); + +/** + * @} + */ + +/** @addtogroup RCCEx_Exported_Functions_Group3 + * @{ + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLL2(RCC_PLL2InitTypeDef *PLL2Init); +HAL_StatusTypeDef HAL_RCCEx_DisablePLL2(void); + +/** + * @} + */ +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_HAL_RCC_EX_H */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_bus.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_bus.h new file mode 100644 index 0000000..146fd88 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_bus.h @@ -0,0 +1,1012 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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) 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 __STM32F1xx_LL_BUS_H +#define __STM32F1xx_LL_BUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup BUS_LL BUS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +#if defined(RCC_AHBRSTR_OTGFSRST) || defined(RCC_AHBRSTR_ETHMACRST) +#define RCC_AHBRSTR_SUPPORT +#endif /* RCC_AHBRSTR_OTGFSRST || RCC_AHBRSTR_ETHMACRST */ + +/* 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 (uint32_t)0xFFFFFFFFU +#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHBENR_CRCEN +#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHBENR_DMA1EN +#if defined(DMA2) +#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHBENR_DMA2EN +#endif /*DMA2*/ +#if defined(ETH) +#define LL_AHB1_GRP1_PERIPH_ETHMAC RCC_AHBENR_ETHMACEN +#define LL_AHB1_GRP1_PERIPH_ETHMACRX RCC_AHBENR_ETHMACRXEN +#define LL_AHB1_GRP1_PERIPH_ETHMACTX RCC_AHBENR_ETHMACTXEN +#endif /*ETH*/ +#define LL_AHB1_GRP1_PERIPH_FLASH RCC_AHBENR_FLITFEN +#if defined(FSMC_Bank1) +#define LL_AHB1_GRP1_PERIPH_FSMC RCC_AHBENR_FSMCEN +#endif /*FSMC_Bank1*/ +#if defined(USB_OTG_FS) +#define LL_AHB1_GRP1_PERIPH_OTGFS RCC_AHBENR_OTGFSEN +#endif /*USB_OTG_FS*/ +#if defined(SDIO) +#define LL_AHB1_GRP1_PERIPH_SDIO RCC_AHBENR_SDIOEN +#endif /*SDIO*/ +#define LL_AHB1_GRP1_PERIPH_SRAM RCC_AHBENR_SRAMEN +/** + * @} + */ + +/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH + * @{ + */ +#define LL_APB1_GRP1_PERIPH_ALL (uint32_t)0xFFFFFFFFU +#define LL_APB1_GRP1_PERIPH_BKP RCC_APB1ENR_BKPEN +#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(CEC) +#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN +#endif /*CEC*/ +#if defined(DAC) +#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DACEN +#endif /*DAC*/ +#define LL_APB1_GRP1_PERIPH_I2C1 RCC_APB1ENR_I2C1EN +#if defined(I2C2) +#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN +#endif /*I2C2*/ +#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN +#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(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*/ +#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN +#define LL_APB1_GRP1_PERIPH_TIM3 RCC_APB1ENR_TIM3EN +#if defined(TIM4) +#define LL_APB1_GRP1_PERIPH_TIM4 RCC_APB1ENR_TIM4EN +#endif /*TIM4*/ +#if defined(TIM5) +#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN +#endif /*TIM5*/ +#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(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_USART2 RCC_APB1ENR_USART2EN +#if defined(USART3) +#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN +#endif /*USART3*/ +#if defined(USB) +#define LL_APB1_GRP1_PERIPH_USB RCC_APB1ENR_USBEN +#endif /*USB*/ +#define LL_APB1_GRP1_PERIPH_WWDG RCC_APB1ENR_WWDGEN +/** + * @} + */ + +/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH + * @{ + */ +#define LL_APB2_GRP1_PERIPH_ALL (uint32_t)0xFFFFFFFFU +#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*/ +#define LL_APB2_GRP1_PERIPH_AFIO RCC_APB2ENR_AFIOEN +#define LL_APB2_GRP1_PERIPH_GPIOA RCC_APB2ENR_IOPAEN +#define LL_APB2_GRP1_PERIPH_GPIOB RCC_APB2ENR_IOPBEN +#define LL_APB2_GRP1_PERIPH_GPIOC RCC_APB2ENR_IOPCEN +#define LL_APB2_GRP1_PERIPH_GPIOD RCC_APB2ENR_IOPDEN +#if defined(GPIOE) +#define LL_APB2_GRP1_PERIPH_GPIOE RCC_APB2ENR_IOPEEN +#endif /*GPIOE*/ +#if defined(GPIOF) +#define LL_APB2_GRP1_PERIPH_GPIOF RCC_APB2ENR_IOPFEN +#endif /*GPIOF*/ +#if defined(GPIOG) +#define LL_APB2_GRP1_PERIPH_GPIOG RCC_APB2ENR_IOPGEN +#endif /*GPIOG*/ +#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN +#if defined(TIM10) +#define LL_APB2_GRP1_PERIPH_TIM10 RCC_APB2ENR_TIM10EN +#endif /*TIM10*/ +#if defined(TIM11) +#define LL_APB2_GRP1_PERIPH_TIM11 RCC_APB2ENR_TIM11EN +#endif /*TIM11*/ +#if defined(TIM15) +#define LL_APB2_GRP1_PERIPH_TIM15 RCC_APB2ENR_TIM15EN +#endif /*TIM15*/ +#if defined(TIM16) +#define LL_APB2_GRP1_PERIPH_TIM16 RCC_APB2ENR_TIM16EN +#endif /*TIM16*/ +#if defined(TIM17) +#define LL_APB2_GRP1_PERIPH_TIM17 RCC_APB2ENR_TIM17EN +#endif /*TIM17*/ +#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN +#if defined(TIM8) +#define LL_APB2_GRP1_PERIPH_TIM8 RCC_APB2ENR_TIM8EN +#endif /*TIM8*/ +#if defined(TIM9) +#define LL_APB2_GRP1_PERIPH_TIM9 RCC_APB2ENR_TIM9EN +#endif /*TIM9*/ +#define LL_APB2_GRP1_PERIPH_USART1 RCC_APB2ENR_USART1EN +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions + * @{ + */ + +/** @defgroup BUS_LL_EF_AHB1 AHB1 + * @{ + */ + +/** + * @brief Enable AHB1 peripherals clock. + * @rmtoll AHBENR CRCEN LL_AHB1_GRP1_EnableClock\n + * AHBENR DMA1EN LL_AHB1_GRP1_EnableClock\n + * AHBENR DMA2EN LL_AHB1_GRP1_EnableClock\n + * AHBENR ETHMACEN LL_AHB1_GRP1_EnableClock\n + * AHBENR ETHMACRXEN LL_AHB1_GRP1_EnableClock\n + * AHBENR ETHMACTXEN LL_AHB1_GRP1_EnableClock\n + * AHBENR FLITFEN LL_AHB1_GRP1_EnableClock\n + * AHBENR FSMCEN LL_AHB1_GRP1_EnableClock\n + * AHBENR OTGFSEN LL_AHB1_GRP1_EnableClock\n + * AHBENR SDIOEN LL_AHB1_GRP1_EnableClock\n + * AHBENR SRAMEN LL_AHB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @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_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLASH + * @arg @ref LL_AHB1_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGFS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM + * + * (*) 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->AHBENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHBENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB1 peripheral clock is enabled or not + * @rmtoll AHBENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR ETHMACEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR ETHMACRXEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR ETHMACTXEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR FLITFEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR FSMCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR OTGFSEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR SDIOEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR SRAMEN LL_AHB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @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_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLASH + * @arg @ref LL_AHB1_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGFS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM + * + * (*) 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->AHBENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB1 peripherals clock. + * @rmtoll AHBENR CRCEN LL_AHB1_GRP1_DisableClock\n + * AHBENR DMA1EN LL_AHB1_GRP1_DisableClock\n + * AHBENR DMA2EN LL_AHB1_GRP1_DisableClock\n + * AHBENR ETHMACEN LL_AHB1_GRP1_DisableClock\n + * AHBENR ETHMACRXEN LL_AHB1_GRP1_DisableClock\n + * AHBENR ETHMACTXEN LL_AHB1_GRP1_DisableClock\n + * AHBENR FLITFEN LL_AHB1_GRP1_DisableClock\n + * AHBENR FSMCEN LL_AHB1_GRP1_DisableClock\n + * AHBENR OTGFSEN LL_AHB1_GRP1_DisableClock\n + * AHBENR SDIOEN LL_AHB1_GRP1_DisableClock\n + * AHBENR SRAMEN LL_AHB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @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_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLASH + * @arg @ref LL_AHB1_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGFS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHBENR, Periphs); +} + +#if defined(RCC_AHBRSTR_SUPPORT) +/** + * @brief Force AHB1 peripherals reset. + * @rmtoll AHBRSTR ETHMACRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR OTGFSRST 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_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHBRSTR, Periphs); +} + +/** + * @brief Release AHB1 peripherals reset. + * @rmtoll AHBRSTR ETHMACRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR OTGFSRST 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_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHBRSTR, Periphs); +} +#endif /* RCC_AHBRSTR_SUPPORT */ + +/** + * @} + */ + +/** @defgroup BUS_LL_EF_APB1 APB1 + * @{ + */ + +/** + * @brief Enable APB1 peripherals clock. + * @rmtoll APB1ENR BKPEN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n + * APB1ENR DACEN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPI3EN 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 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 UART4EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART5EN LL_APB1_GRP1_EnableClock\n + * APB1ENR USART2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR USART3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR USBEN LL_APB1_GRP1_EnableClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_BKP + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @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_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_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * + * (*) 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 BKPEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR DACEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPI3EN 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 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 UART4EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART5EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USART2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USART3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USBEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_BKP + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @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_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_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * + * (*) 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 BKPEN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n + * APB1ENR DACEN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPI3EN 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 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 UART4EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART5EN LL_APB1_GRP1_DisableClock\n + * APB1ENR USART2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR USART3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR USBEN LL_APB1_GRP1_DisableClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_BKP + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @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_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_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * + * (*) 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 BKPRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR DACRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPI2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPI3RST 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 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 UART4RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART5RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USART2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USART3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USBRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR WWDGRST LL_APB1_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_ALL + * @arg @ref LL_APB1_GRP1_PERIPH_BKP + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @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_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_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * + * (*) 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 BKPRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR DACRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPI2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPI3RST 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 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 UART4RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART5RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USART2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USART3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USBRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR WWDGRST LL_APB1_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_ALL + * @arg @ref LL_APB1_GRP1_PERIPH_BKP + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @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_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_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1RSTR, Periphs); +} + +/** + * @} + */ + +/** @defgroup BUS_LL_EF_APB2 APB2 + * @{ + */ + +/** + * @brief Enable APB2 peripherals clock. + * @rmtoll APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_EnableClock\n + * APB2ENR AFIOEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPAEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPBEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPCEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPDEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPEEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPFEN LL_APB2_GRP1_EnableClock\n + * APB2ENR IOPGEN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM15EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM16EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM17EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_EnableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @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_AFIO + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOA + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOB + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOC + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOD + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * + * (*) 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 ADC1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR AFIOEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPAEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPBEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPCEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPDEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPEEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPFEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR IOPGEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM15EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM16EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM17EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @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_AFIO + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOA + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOB + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOC + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOD + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * + * (*) 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 ADC1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_DisableClock\n + * APB2ENR AFIOEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPAEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPBEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPCEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPDEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPEEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPFEN LL_APB2_GRP1_DisableClock\n + * APB2ENR IOPGEN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM15EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM16EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM17EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_DisableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @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_AFIO + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOA + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOB + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOC + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOD + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * + * (*) 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 ADC1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR ADC2RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR ADC3RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR AFIORST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPARST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPBRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPCRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPDRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPERST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPFRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR IOPGRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM10RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM11RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM15RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM16RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM17RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM9RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR USART1RST 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_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_AFIO + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOA + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOB + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOC + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOD + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * + * (*) 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 ADC1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR ADC2RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR ADC3RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR AFIORST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPARST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPBRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPCRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPDRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPERST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPFRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR IOPGRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM10RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM11RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM15RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM16RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM17RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM9RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR USART1RST 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_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_AFIO + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOA + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOB + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOC + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOD + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_APB2_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2RSTR, Periphs); +} + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_LL_BUS_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_cortex.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_cortex.h new file mode 100644 index 0000000..c1fb2c7 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_cortex.h @@ -0,0 +1,638 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_LL_CORTEX_H +#define __STM32F1xx_LL_CORTEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_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)); +} + +/** + * @} + */ + +/** @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 (0x1: revision 1, 0x2: revision 2) + */ +__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-M3 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 0xC23 for Cortex-M3 + */ +__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 (0x0: patch 0, 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 /* __STM32F1xx_LL_CORTEX_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_dma.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_dma.h new file mode 100644 index 0000000..9c526e8 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_dma.h @@ -0,0 +1,1958 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_dma.h + * @author MCD Application Team + * @brief Header file of DMA 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 __STM32F1xx_LL_DMA_H +#define __STM32F1xx_LL_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_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 channel register offset versus channel index LL_DMA_CHANNEL_x */ +static const uint8_t CHANNEL_OFFSET_TAB[] = +{ + (uint8_t)(DMA1_Channel1_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel2_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel3_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel4_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel5_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel6_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel7_BASE - DMA1_BASE) +}; +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_Private_Macros DMA Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* 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 Channel + + 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 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_SetChannelPriorityLevel(). */ + +} LL_DMA_InitTypeDef; +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants + * @{ + */ +/** @defgroup DMA_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_DMA_WriteReg function + * @{ + */ +#define LL_DMA_IFCR_CGIF1 DMA_IFCR_CGIF1 /*!< Channel 1 global flag */ +#define LL_DMA_IFCR_CTCIF1 DMA_IFCR_CTCIF1 /*!< Channel 1 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF1 DMA_IFCR_CHTIF1 /*!< Channel 1 half transfer flag */ +#define LL_DMA_IFCR_CTEIF1 DMA_IFCR_CTEIF1 /*!< Channel 1 transfer error flag */ +#define LL_DMA_IFCR_CGIF2 DMA_IFCR_CGIF2 /*!< Channel 2 global flag */ +#define LL_DMA_IFCR_CTCIF2 DMA_IFCR_CTCIF2 /*!< Channel 2 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF2 DMA_IFCR_CHTIF2 /*!< Channel 2 half transfer flag */ +#define LL_DMA_IFCR_CTEIF2 DMA_IFCR_CTEIF2 /*!< Channel 2 transfer error flag */ +#define LL_DMA_IFCR_CGIF3 DMA_IFCR_CGIF3 /*!< Channel 3 global flag */ +#define LL_DMA_IFCR_CTCIF3 DMA_IFCR_CTCIF3 /*!< Channel 3 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF3 DMA_IFCR_CHTIF3 /*!< Channel 3 half transfer flag */ +#define LL_DMA_IFCR_CTEIF3 DMA_IFCR_CTEIF3 /*!< Channel 3 transfer error flag */ +#define LL_DMA_IFCR_CGIF4 DMA_IFCR_CGIF4 /*!< Channel 4 global flag */ +#define LL_DMA_IFCR_CTCIF4 DMA_IFCR_CTCIF4 /*!< Channel 4 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF4 DMA_IFCR_CHTIF4 /*!< Channel 4 half transfer flag */ +#define LL_DMA_IFCR_CTEIF4 DMA_IFCR_CTEIF4 /*!< Channel 4 transfer error flag */ +#define LL_DMA_IFCR_CGIF5 DMA_IFCR_CGIF5 /*!< Channel 5 global flag */ +#define LL_DMA_IFCR_CTCIF5 DMA_IFCR_CTCIF5 /*!< Channel 5 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF5 DMA_IFCR_CHTIF5 /*!< Channel 5 half transfer flag */ +#define LL_DMA_IFCR_CTEIF5 DMA_IFCR_CTEIF5 /*!< Channel 5 transfer error flag */ +#define LL_DMA_IFCR_CGIF6 DMA_IFCR_CGIF6 /*!< Channel 6 global flag */ +#define LL_DMA_IFCR_CTCIF6 DMA_IFCR_CTCIF6 /*!< Channel 6 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF6 DMA_IFCR_CHTIF6 /*!< Channel 6 half transfer flag */ +#define LL_DMA_IFCR_CTEIF6 DMA_IFCR_CTEIF6 /*!< Channel 6 transfer error flag */ +#define LL_DMA_IFCR_CGIF7 DMA_IFCR_CGIF7 /*!< Channel 7 global flag */ +#define LL_DMA_IFCR_CTCIF7 DMA_IFCR_CTCIF7 /*!< Channel 7 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF7 DMA_IFCR_CHTIF7 /*!< Channel 7 half transfer flag */ +#define LL_DMA_IFCR_CTEIF7 DMA_IFCR_CTEIF7 /*!< Channel 7 transfer error flag */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_DMA_ReadReg function + * @{ + */ +#define LL_DMA_ISR_GIF1 DMA_ISR_GIF1 /*!< Channel 1 global flag */ +#define LL_DMA_ISR_TCIF1 DMA_ISR_TCIF1 /*!< Channel 1 transfer complete flag */ +#define LL_DMA_ISR_HTIF1 DMA_ISR_HTIF1 /*!< Channel 1 half transfer flag */ +#define LL_DMA_ISR_TEIF1 DMA_ISR_TEIF1 /*!< Channel 1 transfer error flag */ +#define LL_DMA_ISR_GIF2 DMA_ISR_GIF2 /*!< Channel 2 global flag */ +#define LL_DMA_ISR_TCIF2 DMA_ISR_TCIF2 /*!< Channel 2 transfer complete flag */ +#define LL_DMA_ISR_HTIF2 DMA_ISR_HTIF2 /*!< Channel 2 half transfer flag */ +#define LL_DMA_ISR_TEIF2 DMA_ISR_TEIF2 /*!< Channel 2 transfer error flag */ +#define LL_DMA_ISR_GIF3 DMA_ISR_GIF3 /*!< Channel 3 global flag */ +#define LL_DMA_ISR_TCIF3 DMA_ISR_TCIF3 /*!< Channel 3 transfer complete flag */ +#define LL_DMA_ISR_HTIF3 DMA_ISR_HTIF3 /*!< Channel 3 half transfer flag */ +#define LL_DMA_ISR_TEIF3 DMA_ISR_TEIF3 /*!< Channel 3 transfer error flag */ +#define LL_DMA_ISR_GIF4 DMA_ISR_GIF4 /*!< Channel 4 global flag */ +#define LL_DMA_ISR_TCIF4 DMA_ISR_TCIF4 /*!< Channel 4 transfer complete flag */ +#define LL_DMA_ISR_HTIF4 DMA_ISR_HTIF4 /*!< Channel 4 half transfer flag */ +#define LL_DMA_ISR_TEIF4 DMA_ISR_TEIF4 /*!< Channel 4 transfer error flag */ +#define LL_DMA_ISR_GIF5 DMA_ISR_GIF5 /*!< Channel 5 global flag */ +#define LL_DMA_ISR_TCIF5 DMA_ISR_TCIF5 /*!< Channel 5 transfer complete flag */ +#define LL_DMA_ISR_HTIF5 DMA_ISR_HTIF5 /*!< Channel 5 half transfer flag */ +#define LL_DMA_ISR_TEIF5 DMA_ISR_TEIF5 /*!< Channel 5 transfer error flag */ +#define LL_DMA_ISR_GIF6 DMA_ISR_GIF6 /*!< Channel 6 global flag */ +#define LL_DMA_ISR_TCIF6 DMA_ISR_TCIF6 /*!< Channel 6 transfer complete flag */ +#define LL_DMA_ISR_HTIF6 DMA_ISR_HTIF6 /*!< Channel 6 half transfer flag */ +#define LL_DMA_ISR_TEIF6 DMA_ISR_TEIF6 /*!< Channel 6 transfer error flag */ +#define LL_DMA_ISR_GIF7 DMA_ISR_GIF7 /*!< Channel 7 global flag */ +#define LL_DMA_ISR_TCIF7 DMA_ISR_TCIF7 /*!< Channel 7 transfer complete flag */ +#define LL_DMA_ISR_HTIF7 DMA_ISR_HTIF7 /*!< Channel 7 half transfer flag */ +#define LL_DMA_ISR_TEIF7 DMA_ISR_TEIF7 /*!< Channel 7 transfer error flag */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_DMA_ReadReg and LL_DMA_WriteReg functions + * @{ + */ +#define LL_DMA_CCR_TCIE DMA_CCR_TCIE /*!< Transfer complete interrupt */ +#define LL_DMA_CCR_HTIE DMA_CCR_HTIE /*!< Half Transfer interrupt */ +#define LL_DMA_CCR_TEIE DMA_CCR_TEIE /*!< Transfer error interrupt */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_CHANNEL CHANNEL + * @{ + */ +#define LL_DMA_CHANNEL_1 0x00000001U /*!< DMA Channel 1 */ +#define LL_DMA_CHANNEL_2 0x00000002U /*!< DMA Channel 2 */ +#define LL_DMA_CHANNEL_3 0x00000003U /*!< DMA Channel 3 */ +#define LL_DMA_CHANNEL_4 0x00000004U /*!< DMA Channel 4 */ +#define LL_DMA_CHANNEL_5 0x00000005U /*!< DMA Channel 5 */ +#define LL_DMA_CHANNEL_6 0x00000006U /*!< DMA Channel 6 */ +#define LL_DMA_CHANNEL_7 0x00000007U /*!< DMA Channel 7 */ +#if defined(USE_FULL_LL_DRIVER) +#define LL_DMA_CHANNEL_ALL 0xFFFF0000U /*!< DMA Channel all (used only for function @ref LL_DMA_DeInit(). */ +#endif /*USE_FULL_LL_DRIVER*/ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_DIRECTION Transfer Direction + * @{ + */ +#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_CCR_DIR /*!< Memory to peripheral direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_CCR_MEM2MEM /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MODE Transfer mode + * @{ + */ +#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ +#define LL_DMA_MODE_CIRCULAR DMA_CCR_CIRC /*!< Circular Mode */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PERIPH Peripheral increment mode + * @{ + */ +#define LL_DMA_PERIPH_INCREMENT DMA_CCR_PINC /*!< Peripheral increment mode Enable */ +#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MEMORY Memory increment mode + * @{ + */ +#define LL_DMA_MEMORY_INCREMENT DMA_CCR_MINC /*!< Memory increment mode Enable */ +#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PDATAALIGN Peripheral data alignment + * @{ + */ +#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ +#define LL_DMA_PDATAALIGN_HALFWORD DMA_CCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ +#define LL_DMA_PDATAALIGN_WORD DMA_CCR_PSIZE_1 /*!< Peripheral data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MDATAALIGN Memory data alignment + * @{ + */ +#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ +#define LL_DMA_MDATAALIGN_HALFWORD DMA_CCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ +#define LL_DMA_MDATAALIGN_WORD DMA_CCR_MSIZE_1 /*!< Memory data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PRIORITY Transfer Priority level + * @{ + */ +#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ +#define LL_DMA_PRIORITY_MEDIUM DMA_CCR_PL_0 /*!< Priority level : Medium */ +#define LL_DMA_PRIORITY_HIGH DMA_CCR_PL_1 /*!< Priority level : High */ +#define LL_DMA_PRIORITY_VERYHIGH DMA_CCR_PL /*!< Priority level : Very_High */ +/** + * @} + */ + +/** + * @} + */ + +/* 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 DMAxChannely + * @{ + */ + +/** + * @brief Convert DMAx_Channely into DMAx + * @param __CHANNEL_INSTANCE__ DMAx_Channely + * @retval DMAx + */ +#if defined(DMA2) +#define __LL_DMA_GET_INSTANCE(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) > ((uint32_t)DMA1_Channel7)) ? DMA2 : DMA1) +#else +#define __LL_DMA_GET_INSTANCE(__CHANNEL_INSTANCE__) (DMA1) +#endif + +/** + * @brief Convert DMAx_Channely into LL_DMA_CHANNEL_y + * @param __CHANNEL_INSTANCE__ DMAx_Channely + * @retval LL_DMA_CHANNEL_y + */ +#if defined (DMA2) +#define __LL_DMA_GET_CHANNEL(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel6)) ? LL_DMA_CHANNEL_6 : \ + LL_DMA_CHANNEL_7) +#else +#define __LL_DMA_GET_CHANNEL(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel6)) ? LL_DMA_CHANNEL_6 : \ + LL_DMA_CHANNEL_7) +#endif + +/** + * @brief Convert DMA Instance DMAx and LL_DMA_CHANNEL_y into DMAx_Channely + * @param __DMA_INSTANCE__ DMAx + * @param __CHANNEL__ LL_DMA_CHANNEL_y + * @retval DMAx_Channely + */ +#if defined (DMA2) +#define __LL_DMA_GET_CHANNEL_INSTANCE(__DMA_INSTANCE__, __CHANNEL__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA1_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA2_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA1_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA2_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA1_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA2_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA1_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA2_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA1_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA2_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_6))) ? DMA1_Channel6 : \ + DMA1_Channel7) +#else +#define __LL_DMA_GET_CHANNEL_INSTANCE(__DMA_INSTANCE__, __CHANNEL__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA1_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA1_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA1_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA1_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA1_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_6))) ? DMA1_Channel6 : \ + DMA1_Channel7) +#endif + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Functions DMA Exported Functions + * @{ + */ + +/** @defgroup DMA_LL_EF_Configuration Configuration + * @{ + */ +/** + * @brief Enable DMA channel. + * @rmtoll CCR EN LL_DMA_EnableChannel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableChannel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_EN); +} + +/** + * @brief Disable DMA channel. + * @rmtoll CCR EN LL_DMA_DisableChannel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableChannel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_EN); +} + +/** + * @brief Check if DMA channel is enabled or disabled. + * @rmtoll CCR EN LL_DMA_IsEnabledChannel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledChannel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_EN) == (DMA_CCR_EN)); +} + +/** + * @brief Configure all parameters link to DMA transfer. + * @rmtoll CCR DIR LL_DMA_ConfigTransfer\n + * CCR MEM2MEM LL_DMA_ConfigTransfer\n + * CCR CIRC LL_DMA_ConfigTransfer\n + * CCR PINC LL_DMA_ConfigTransfer\n + * CCR MINC LL_DMA_ConfigTransfer\n + * CCR PSIZE LL_DMA_ConfigTransfer\n + * CCR MSIZE LL_DMA_ConfigTransfer\n + * CCR PL LL_DMA_ConfigTransfer + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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 + * @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 Channel, uint32_t Configuration) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_DIR | DMA_CCR_MEM2MEM | DMA_CCR_CIRC | DMA_CCR_PINC | DMA_CCR_MINC | DMA_CCR_PSIZE | DMA_CCR_MSIZE | DMA_CCR_PL, + Configuration); +} + +/** + * @brief Set Data transfer direction (read from peripheral or from memory). + * @rmtoll CCR DIR LL_DMA_SetDataTransferDirection\n + * CCR MEM2MEM LL_DMA_SetDataTransferDirection + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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 Channel, uint32_t Direction) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_DIR | DMA_CCR_MEM2MEM, Direction); +} + +/** + * @brief Get Data transfer direction (read from peripheral or from memory). + * @rmtoll CCR DIR LL_DMA_GetDataTransferDirection\n + * CCR MEM2MEM LL_DMA_GetDataTransferDirection + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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 Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_DIR | DMA_CCR_MEM2MEM)); +} + +/** + * @brief Set DMA mode circular or normal. + * @note The circular buffer mode cannot be used if the memory-to-memory + * data transfer is configured on the selected Channel. + * @rmtoll CCR CIRC LL_DMA_SetMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Mode) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_CIRC, + Mode); +} + +/** + * @brief Get DMA mode circular or normal. + * @rmtoll CCR CIRC LL_DMA_GetMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + */ +__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_CIRC)); +} + +/** + * @brief Set Peripheral increment mode. + * @rmtoll CCR PINC LL_DMA_SetPeriphIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param PeriphOrM2MSrcIncMode This parameter can be one of the following values: + * @arg @ref LL_DMA_PERIPH_INCREMENT + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphOrM2MSrcIncMode) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_PINC, + PeriphOrM2MSrcIncMode); +} + +/** + * @brief Get Peripheral increment mode. + * @rmtoll CCR PINC LL_DMA_GetPeriphIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PERIPH_INCREMENT + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_PINC)); +} + +/** + * @brief Set Memory increment mode. + * @rmtoll CCR MINC LL_DMA_SetMemoryIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryOrM2MDstIncMode This parameter can be one of the following values: + * @arg @ref LL_DMA_MEMORY_INCREMENT + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryOrM2MDstIncMode) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_MINC, + MemoryOrM2MDstIncMode); +} + +/** + * @brief Get Memory increment mode. + * @rmtoll CCR MINC LL_DMA_GetMemoryIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MEMORY_INCREMENT + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_MINC)); +} + +/** + * @brief Set Peripheral size. + * @rmtoll CCR PSIZE LL_DMA_SetPeriphSize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param PeriphOrM2MSrcDataSize 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 Channel, uint32_t PeriphOrM2MSrcDataSize) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_PSIZE, + PeriphOrM2MSrcDataSize); +} + +/** + * @brief Get Peripheral size. + * @rmtoll CCR PSIZE LL_DMA_GetPeriphSize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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 Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_PSIZE)); +} + +/** + * @brief Set Memory size. + * @rmtoll CCR MSIZE LL_DMA_SetMemorySize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryOrM2MDstDataSize 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 Channel, uint32_t MemoryOrM2MDstDataSize) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_MSIZE, + MemoryOrM2MDstDataSize); +} + +/** + * @brief Get Memory size. + * @rmtoll CCR MSIZE LL_DMA_GetMemorySize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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 Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_MSIZE)); +} + +/** + * @brief Set Channel priority level. + * @rmtoll CCR PL LL_DMA_SetChannelPriorityLevel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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_SetChannelPriorityLevel(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Priority) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_PL, + Priority); +} + +/** + * @brief Get Channel priority level. + * @rmtoll CCR PL LL_DMA_GetChannelPriorityLevel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @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_GetChannelPriorityLevel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_PL)); +} + +/** + * @brief Set Number of data to transfer. + * @note This action has no effect if + * channel is enabled. + * @rmtoll CNDTR NDT LL_DMA_SetDataLength + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param NbData Between Min_Data = 0 and Max_Data = 0x0000FFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t NbData) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CNDTR, + DMA_CNDTR_NDT, NbData); +} + +/** + * @brief Get Number of data to transfer. + * @note Once the channel is enabled, the return value indicate the + * remaining bytes to be transmitted. + * @rmtoll CNDTR NDT LL_DMA_GetDataLength + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CNDTR, + DMA_CNDTR_NDT)); +} + +/** + * @brief Configure the Source and Destination addresses. + * @note This API must not be called when the DMA channel is enabled. + * @note Each IP using DMA provides an API to get directly the register address (LL_PPP_DMA_GetRegAddr). + * @rmtoll CPAR PA LL_DMA_ConfigAddresses\n + * CMAR MA LL_DMA_ConfigAddresses + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param SrcAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @param DstAddress Between Min_Data = 0 and Max_Data = 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 Channel, uint32_t SrcAddress, + uint32_t DstAddress, uint32_t Direction) +{ + /* Direction Memory to Periph */ + if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) + { + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, SrcAddress); + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, DstAddress); + } + /* Direction Periph to Memory and Memory to Memory */ + else + { + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, SrcAddress); + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, DstAddress); + } +} + +/** + * @brief Set the Memory address. + * @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. + * @rmtoll CMAR MA LL_DMA_SetMemoryAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, MemoryAddress); +} + +/** + * @brief Set the Peripheral address. + * @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. + * @rmtoll CPAR PA LL_DMA_SetPeriphAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param PeriphAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, PeriphAddress); +} + +/** + * @brief Get Memory address. + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @rmtoll CMAR MA LL_DMA_GetMemoryAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR)); +} + +/** + * @brief Get Peripheral address. + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @rmtoll CPAR PA LL_DMA_GetPeriphAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR)); +} + +/** + * @brief Set the Memory to Memory Source address. + * @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. + * @rmtoll CPAR PA LL_DMA_SetM2MSrcAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, MemoryAddress); +} + +/** + * @brief Set the Memory to Memory Destination address. + * @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. + * @rmtoll CMAR MA LL_DMA_SetM2MDstAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, MemoryAddress); +} + +/** + * @brief Get the Memory to Memory Source address. + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @rmtoll CPAR PA LL_DMA_GetM2MSrcAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR)); +} + +/** + * @brief Get the Memory to Memory Destination address. + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @rmtoll CMAR MA LL_DMA_GetM2MDstAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR)); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Channel 1 global interrupt flag. + * @rmtoll ISR GIF1 LL_DMA_IsActiveFlag_GI1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF1) == (DMA_ISR_GIF1)); +} + +/** + * @brief Get Channel 2 global interrupt flag. + * @rmtoll ISR GIF2 LL_DMA_IsActiveFlag_GI2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF2) == (DMA_ISR_GIF2)); +} + +/** + * @brief Get Channel 3 global interrupt flag. + * @rmtoll ISR GIF3 LL_DMA_IsActiveFlag_GI3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF3) == (DMA_ISR_GIF3)); +} + +/** + * @brief Get Channel 4 global interrupt flag. + * @rmtoll ISR GIF4 LL_DMA_IsActiveFlag_GI4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF4) == (DMA_ISR_GIF4)); +} + +/** + * @brief Get Channel 5 global interrupt flag. + * @rmtoll ISR GIF5 LL_DMA_IsActiveFlag_GI5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF5) == (DMA_ISR_GIF5)); +} + +/** + * @brief Get Channel 6 global interrupt flag. + * @rmtoll ISR GIF6 LL_DMA_IsActiveFlag_GI6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF6) == (DMA_ISR_GIF6)); +} + +/** + * @brief Get Channel 7 global interrupt flag. + * @rmtoll ISR GIF7 LL_DMA_IsActiveFlag_GI7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF7) == (DMA_ISR_GIF7)); +} + +/** + * @brief Get Channel 1 transfer complete flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TCIF1) == (DMA_ISR_TCIF1)); +} + +/** + * @brief Get Channel 2 transfer complete flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TCIF2) == (DMA_ISR_TCIF2)); +} + +/** + * @brief Get Channel 3 transfer complete flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TCIF3) == (DMA_ISR_TCIF3)); +} + +/** + * @brief Get Channel 4 transfer complete flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TCIF4) == (DMA_ISR_TCIF4)); +} + +/** + * @brief Get Channel 5 transfer complete flag. + * @rmtoll ISR TCIF5 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->ISR, DMA_ISR_TCIF5) == (DMA_ISR_TCIF5)); +} + +/** + * @brief Get Channel 6 transfer complete flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TCIF6) == (DMA_ISR_TCIF6)); +} + +/** + * @brief Get Channel 7 transfer complete flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TCIF7) == (DMA_ISR_TCIF7)); +} + +/** + * @brief Get Channel 1 half transfer flag. + * @rmtoll ISR 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->ISR, DMA_ISR_HTIF1) == (DMA_ISR_HTIF1)); +} + +/** + * @brief Get Channel 2 half transfer flag. + * @rmtoll ISR 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->ISR, DMA_ISR_HTIF2) == (DMA_ISR_HTIF2)); +} + +/** + * @brief Get Channel 3 half transfer flag. + * @rmtoll ISR 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->ISR, DMA_ISR_HTIF3) == (DMA_ISR_HTIF3)); +} + +/** + * @brief Get Channel 4 half transfer flag. + * @rmtoll ISR 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->ISR, DMA_ISR_HTIF4) == (DMA_ISR_HTIF4)); +} + +/** + * @brief Get Channel 5 half transfer flag. + * @rmtoll ISR HTIF5 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->ISR, DMA_ISR_HTIF5) == (DMA_ISR_HTIF5)); +} + +/** + * @brief Get Channel 6 half transfer flag. + * @rmtoll ISR 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->ISR, DMA_ISR_HTIF6) == (DMA_ISR_HTIF6)); +} + +/** + * @brief Get Channel 7 half transfer flag. + * @rmtoll ISR 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->ISR, DMA_ISR_HTIF7) == (DMA_ISR_HTIF7)); +} + +/** + * @brief Get Channel 1 transfer error flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TEIF1) == (DMA_ISR_TEIF1)); +} + +/** + * @brief Get Channel 2 transfer error flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TEIF2) == (DMA_ISR_TEIF2)); +} + +/** + * @brief Get Channel 3 transfer error flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TEIF3) == (DMA_ISR_TEIF3)); +} + +/** + * @brief Get Channel 4 transfer error flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TEIF4) == (DMA_ISR_TEIF4)); +} + +/** + * @brief Get Channel 5 transfer error flag. + * @rmtoll ISR TEIF5 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->ISR, DMA_ISR_TEIF5) == (DMA_ISR_TEIF5)); +} + +/** + * @brief Get Channel 6 transfer error flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TEIF6) == (DMA_ISR_TEIF6)); +} + +/** + * @brief Get Channel 7 transfer error flag. + * @rmtoll ISR 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->ISR, DMA_ISR_TEIF7) == (DMA_ISR_TEIF7)); +} + +/** + * @brief Clear Channel 1 global interrupt flag. + * @rmtoll IFCR CGIF1 LL_DMA_ClearFlag_GI1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF1); +} + +/** + * @brief Clear Channel 2 global interrupt flag. + * @rmtoll IFCR CGIF2 LL_DMA_ClearFlag_GI2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF2); +} + +/** + * @brief Clear Channel 3 global interrupt flag. + * @rmtoll IFCR CGIF3 LL_DMA_ClearFlag_GI3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF3); +} + +/** + * @brief Clear Channel 4 global interrupt flag. + * @rmtoll IFCR CGIF4 LL_DMA_ClearFlag_GI4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF4); +} + +/** + * @brief Clear Channel 5 global interrupt flag. + * @rmtoll IFCR CGIF5 LL_DMA_ClearFlag_GI5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF5); +} + +/** + * @brief Clear Channel 6 global interrupt flag. + * @rmtoll IFCR CGIF6 LL_DMA_ClearFlag_GI6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF6); +} + +/** + * @brief Clear Channel 7 global interrupt flag. + * @rmtoll IFCR CGIF7 LL_DMA_ClearFlag_GI7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF7); +} + +/** + * @brief Clear Channel 1 transfer complete flag. + * @rmtoll IFCR CTCIF1 LL_DMA_ClearFlag_TC1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF1); +} + +/** + * @brief Clear Channel 2 transfer complete flag. + * @rmtoll IFCR CTCIF2 LL_DMA_ClearFlag_TC2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF2); +} + +/** + * @brief Clear Channel 3 transfer complete flag. + * @rmtoll IFCR CTCIF3 LL_DMA_ClearFlag_TC3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF3); +} + +/** + * @brief Clear Channel 4 transfer complete flag. + * @rmtoll IFCR CTCIF4 LL_DMA_ClearFlag_TC4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF4); +} + +/** + * @brief Clear Channel 5 transfer complete flag. + * @rmtoll IFCR CTCIF5 LL_DMA_ClearFlag_TC5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF5); +} + +/** + * @brief Clear Channel 6 transfer complete flag. + * @rmtoll IFCR CTCIF6 LL_DMA_ClearFlag_TC6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF6); +} + +/** + * @brief Clear Channel 7 transfer complete flag. + * @rmtoll IFCR CTCIF7 LL_DMA_ClearFlag_TC7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF7); +} + +/** + * @brief Clear Channel 1 half transfer flag. + * @rmtoll IFCR CHTIF1 LL_DMA_ClearFlag_HT1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF1); +} + +/** + * @brief Clear Channel 2 half transfer flag. + * @rmtoll IFCR CHTIF2 LL_DMA_ClearFlag_HT2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF2); +} + +/** + * @brief Clear Channel 3 half transfer flag. + * @rmtoll IFCR CHTIF3 LL_DMA_ClearFlag_HT3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF3); +} + +/** + * @brief Clear Channel 4 half transfer flag. + * @rmtoll IFCR CHTIF4 LL_DMA_ClearFlag_HT4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF4); +} + +/** + * @brief Clear Channel 5 half transfer flag. + * @rmtoll IFCR CHTIF5 LL_DMA_ClearFlag_HT5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF5); +} + +/** + * @brief Clear Channel 6 half transfer flag. + * @rmtoll IFCR CHTIF6 LL_DMA_ClearFlag_HT6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF6); +} + +/** + * @brief Clear Channel 7 half transfer flag. + * @rmtoll IFCR CHTIF7 LL_DMA_ClearFlag_HT7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF7); +} + +/** + * @brief Clear Channel 1 transfer error flag. + * @rmtoll IFCR CTEIF1 LL_DMA_ClearFlag_TE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF1); +} + +/** + * @brief Clear Channel 2 transfer error flag. + * @rmtoll IFCR CTEIF2 LL_DMA_ClearFlag_TE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF2); +} + +/** + * @brief Clear Channel 3 transfer error flag. + * @rmtoll IFCR CTEIF3 LL_DMA_ClearFlag_TE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF3); +} + +/** + * @brief Clear Channel 4 transfer error flag. + * @rmtoll IFCR CTEIF4 LL_DMA_ClearFlag_TE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF4); +} + +/** + * @brief Clear Channel 5 transfer error flag. + * @rmtoll IFCR CTEIF5 LL_DMA_ClearFlag_TE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF5); +} + +/** + * @brief Clear Channel 6 transfer error flag. + * @rmtoll IFCR CTEIF6 LL_DMA_ClearFlag_TE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF6); +} + +/** + * @brief Clear Channel 7 transfer error flag. + * @rmtoll IFCR CTEIF7 LL_DMA_ClearFlag_TE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF7); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable Transfer complete interrupt. + * @rmtoll CCR TCIE LL_DMA_EnableIT_TC + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TCIE); +} + +/** + * @brief Enable Half transfer interrupt. + * @rmtoll CCR HTIE LL_DMA_EnableIT_HT + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_HTIE); +} + +/** + * @brief Enable Transfer error interrupt. + * @rmtoll CCR TEIE LL_DMA_EnableIT_TE + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TEIE); +} + +/** + * @brief Disable Transfer complete interrupt. + * @rmtoll CCR TCIE LL_DMA_DisableIT_TC + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TCIE); +} + +/** + * @brief Disable Half transfer interrupt. + * @rmtoll CCR HTIE LL_DMA_DisableIT_HT + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_HTIE); +} + +/** + * @brief Disable Transfer error interrupt. + * @rmtoll CCR TEIE LL_DMA_DisableIT_TE + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TEIE); +} + +/** + * @brief Check if Transfer complete Interrupt is enabled. + * @rmtoll CCR TCIE LL_DMA_IsEnabledIT_TC + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_TCIE) == (DMA_CCR_TCIE)); +} + +/** + * @brief Check if Half transfer Interrupt is enabled. + * @rmtoll CCR HTIE LL_DMA_IsEnabledIT_HT + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_HTIE) == (DMA_CCR_HTIE)); +} + +/** + * @brief Check if Transfer error Interrupt is enabled. + * @rmtoll CCR TEIE LL_DMA_IsEnabledIT_TE + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_TEIE) == (DMA_CCR_TEIE)); +} + +/** + * @} + */ + +#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 Channel, LL_DMA_InitTypeDef *DMA_InitStruct); +uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel); +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_LL_DMA_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_exti.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_exti.h new file mode 100644 index 0000000..48a42f0 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_exti.h @@ -0,0 +1,886 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F1xx_LL_EXTI_H +#define STM32F1xx_LL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_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 +#if defined(EXTI_IMR_IM19) +#define LL_EXTI_LINE_19 EXTI_IMR_IM19 /*!< Extended line 19 */ +#endif +#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 (0xFFFFFFFFU) /*!< All Extended line */ + +#if defined(USE_FULL_LL_DRIVER) +#define LL_EXTI_LINE_NONE (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)0x00) /*!< Interrupt Mode */ +#define LL_EXTI_MODE_EVENT ((uint8_t)0x01) /*!< Event Mode */ +#define LL_EXTI_MODE_IT_EVENT ((uint8_t)0x02) /*!< Interrupt & Event Mode */ +/** + * @} + */ + +/** @defgroup EXTI_LL_EC_TRIGGER Edge Trigger + * @{ + */ +#define LL_EXTI_TRIGGER_NONE ((uint8_t)0x00) /*!< No Trigger Mode */ +#define LL_EXTI_TRIGGER_RISING ((uint8_t)0x01) /*!< Trigger Rising Mode */ +#define LL_EXTI_TRIGGER_FALLING ((uint8_t)0x02) /*!< Trigger Falling Mode */ +#define LL_EXTI_TRIGGER_RISING_FALLING ((uint8_t)0x03) /*!< 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_ALL_0_31 + * @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_ALL_0_31 + * @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_ALL_0_31 + * @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_ALL_0_31 + * @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_ALL_0_31 + * @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_ALL_0_31 + * @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 + * @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 + * @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 + * @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 + * @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 + * @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 + * @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 + * @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 + * @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 + * @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 + * @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 /* STM32F1xx_LL_EXTI_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_gpio.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_gpio.h new file mode 100644 index 0000000..7058686 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_gpio.h @@ -0,0 +1,2341 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO 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 STM32F1xx_LL_GPIO_H +#define STM32F1xx_LL_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_LL_Driver + * @{ + */ + +#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) + +/** @defgroup GPIO_LL GPIO + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ + +/** @defgroup GPIO_LL_Private_Constants GPIO Private Constants + * @{ + */ +/* Defines used for Pin Mask Initialization */ +#define GPIO_PIN_MASK_POS 8U +#define GPIO_PIN_NB 16U +/** + * @} + */ + +/* 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().*/ +} 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_BS0 << GPIO_PIN_MASK_POS) | 0x00000001U) /*!< Select pin 0 */ +#define LL_GPIO_PIN_1 ((GPIO_BSRR_BS1 << GPIO_PIN_MASK_POS) | 0x00000002U) /*!< Select pin 1 */ +#define LL_GPIO_PIN_2 ((GPIO_BSRR_BS2 << GPIO_PIN_MASK_POS) | 0x00000004U) /*!< Select pin 2 */ +#define LL_GPIO_PIN_3 ((GPIO_BSRR_BS3 << GPIO_PIN_MASK_POS) | 0x00000008U) /*!< Select pin 3 */ +#define LL_GPIO_PIN_4 ((GPIO_BSRR_BS4 << GPIO_PIN_MASK_POS) | 0x00000010U) /*!< Select pin 4 */ +#define LL_GPIO_PIN_5 ((GPIO_BSRR_BS5 << GPIO_PIN_MASK_POS) | 0x00000020U) /*!< Select pin 5 */ +#define LL_GPIO_PIN_6 ((GPIO_BSRR_BS6 << GPIO_PIN_MASK_POS) | 0x00000040U) /*!< Select pin 6 */ +#define LL_GPIO_PIN_7 ((GPIO_BSRR_BS7 << GPIO_PIN_MASK_POS) | 0x00000080U) /*!< Select pin 7 */ +#define LL_GPIO_PIN_8 ((GPIO_BSRR_BS8 << GPIO_PIN_MASK_POS) | 0x04000001U) /*!< Select pin 8 */ +#define LL_GPIO_PIN_9 ((GPIO_BSRR_BS9 << GPIO_PIN_MASK_POS) | 0x04000002U) /*!< Select pin 9 */ +#define LL_GPIO_PIN_10 ((GPIO_BSRR_BS10 << GPIO_PIN_MASK_POS) | 0x04000004U) /*!< Select pin 10 */ +#define LL_GPIO_PIN_11 ((GPIO_BSRR_BS11 << GPIO_PIN_MASK_POS) | 0x04000008U) /*!< Select pin 11 */ +#define LL_GPIO_PIN_12 ((GPIO_BSRR_BS12 << GPIO_PIN_MASK_POS) | 0x04000010U) /*!< Select pin 12 */ +#define LL_GPIO_PIN_13 ((GPIO_BSRR_BS13 << GPIO_PIN_MASK_POS) | 0x04000020U) /*!< Select pin 13 */ +#define LL_GPIO_PIN_14 ((GPIO_BSRR_BS14 << GPIO_PIN_MASK_POS) | 0x04000040U) /*!< Select pin 14 */ +#define LL_GPIO_PIN_15 ((GPIO_BSRR_BS15 << GPIO_PIN_MASK_POS) | 0x04000080U) /*!< Select pin 15 */ +#define LL_GPIO_PIN_ALL (LL_GPIO_PIN_0 | LL_GPIO_PIN_1 | LL_GPIO_PIN_2 | \ + LL_GPIO_PIN_3 | LL_GPIO_PIN_4 | LL_GPIO_PIN_5 | \ + LL_GPIO_PIN_6 | LL_GPIO_PIN_7 | LL_GPIO_PIN_8 | \ + LL_GPIO_PIN_9 | LL_GPIO_PIN_10 | LL_GPIO_PIN_11 | \ + LL_GPIO_PIN_12 | LL_GPIO_PIN_13 | LL_GPIO_PIN_14 | \ + LL_GPIO_PIN_15) /*!< Select all pins */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_MODE Mode + * @{ + */ +#define LL_GPIO_MODE_ANALOG 0x00000000U /*!< Select analog mode */ +#define LL_GPIO_MODE_FLOATING GPIO_CRL_CNF0_0 /*!< Select floating mode */ +#define LL_GPIO_MODE_INPUT GPIO_CRL_CNF0_1 /*!< Select input mode */ +#define LL_GPIO_MODE_OUTPUT GPIO_CRL_MODE0_0 /*!< Select general purpose output mode */ +#define LL_GPIO_MODE_ALTERNATE (GPIO_CRL_CNF0_1 | GPIO_CRL_MODE0_0) /*!< Select alternate function 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_CRL_CNF0_0 /*!< Select open-drain as output type */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_SPEED Output Speed + * @{ + */ +#define LL_GPIO_MODE_OUTPUT_10MHz GPIO_CRL_MODE0_0 /*!< Select Output mode, max speed 10 MHz */ +#define LL_GPIO_MODE_OUTPUT_2MHz GPIO_CRL_MODE0_1 /*!< Select Output mode, max speed 20 MHz */ +#define LL_GPIO_MODE_OUTPUT_50MHz GPIO_CRL_MODE0 /*!< Select Output mode, max speed 50 MHz */ +/** + * @} + */ + +#define LL_GPIO_SPEED_FREQ_LOW LL_GPIO_MODE_OUTPUT_2MHz /*!< Select I/O low output speed */ +#define LL_GPIO_SPEED_FREQ_MEDIUM LL_GPIO_MODE_OUTPUT_10MHz /*!< Select I/O medium output speed */ +#define LL_GPIO_SPEED_FREQ_HIGH LL_GPIO_MODE_OUTPUT_50MHz /*!< Select I/O high output speed */ + +/** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down + * @{ + */ +#define LL_GPIO_PULL_DOWN 0x00000000U /*!< Select I/O pull down */ +#define LL_GPIO_PULL_UP GPIO_ODR_ODR0 /*!< Select I/O pull up */ + +/** + * @} + */ + +/** @defgroup GPIO_LL_EVENTOUT_PIN EVENTOUT Pin + * @{ + */ + +#define LL_GPIO_AF_EVENTOUT_PIN_0 AFIO_EVCR_PIN_PX0 /*!< EVENTOUT on pin 0 */ +#define LL_GPIO_AF_EVENTOUT_PIN_1 AFIO_EVCR_PIN_PX1 /*!< EVENTOUT on pin 1 */ +#define LL_GPIO_AF_EVENTOUT_PIN_2 AFIO_EVCR_PIN_PX2 /*!< EVENTOUT on pin 2 */ +#define LL_GPIO_AF_EVENTOUT_PIN_3 AFIO_EVCR_PIN_PX3 /*!< EVENTOUT on pin 3 */ +#define LL_GPIO_AF_EVENTOUT_PIN_4 AFIO_EVCR_PIN_PX4 /*!< EVENTOUT on pin 4 */ +#define LL_GPIO_AF_EVENTOUT_PIN_5 AFIO_EVCR_PIN_PX5 /*!< EVENTOUT on pin 5 */ +#define LL_GPIO_AF_EVENTOUT_PIN_6 AFIO_EVCR_PIN_PX6 /*!< EVENTOUT on pin 6 */ +#define LL_GPIO_AF_EVENTOUT_PIN_7 AFIO_EVCR_PIN_PX7 /*!< EVENTOUT on pin 7 */ +#define LL_GPIO_AF_EVENTOUT_PIN_8 AFIO_EVCR_PIN_PX8 /*!< EVENTOUT on pin 8 */ +#define LL_GPIO_AF_EVENTOUT_PIN_9 AFIO_EVCR_PIN_PX9 /*!< EVENTOUT on pin 9 */ +#define LL_GPIO_AF_EVENTOUT_PIN_10 AFIO_EVCR_PIN_PX10 /*!< EVENTOUT on pin 10 */ +#define LL_GPIO_AF_EVENTOUT_PIN_11 AFIO_EVCR_PIN_PX11 /*!< EVENTOUT on pin 11 */ +#define LL_GPIO_AF_EVENTOUT_PIN_12 AFIO_EVCR_PIN_PX12 /*!< EVENTOUT on pin 12 */ +#define LL_GPIO_AF_EVENTOUT_PIN_13 AFIO_EVCR_PIN_PX13 /*!< EVENTOUT on pin 13 */ +#define LL_GPIO_AF_EVENTOUT_PIN_14 AFIO_EVCR_PIN_PX14 /*!< EVENTOUT on pin 14 */ +#define LL_GPIO_AF_EVENTOUT_PIN_15 AFIO_EVCR_PIN_PX15 /*!< EVENTOUT on pin 15 */ + +/** + * @} + */ + +/** @defgroup GPIO_LL_EVENTOUT_PORT EVENTOUT Port + * @{ + */ + +#define LL_GPIO_AF_EVENTOUT_PORT_A AFIO_EVCR_PORT_PA /*!< EVENTOUT on port A */ +#define LL_GPIO_AF_EVENTOUT_PORT_B AFIO_EVCR_PORT_PB /*!< EVENTOUT on port B */ +#define LL_GPIO_AF_EVENTOUT_PORT_C AFIO_EVCR_PORT_PC /*!< EVENTOUT on port C */ +#define LL_GPIO_AF_EVENTOUT_PORT_D AFIO_EVCR_PORT_PD /*!< EVENTOUT on port D */ +#define LL_GPIO_AF_EVENTOUT_PORT_E AFIO_EVCR_PORT_PE /*!< EVENTOUT on port E */ + +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_EXTI_PORT GPIO EXTI PORT + * @{ + */ +#define LL_GPIO_AF_EXTI_PORTA 0U /*!< EXTI PORT A */ +#define LL_GPIO_AF_EXTI_PORTB 1U /*!< EXTI PORT B */ +#define LL_GPIO_AF_EXTI_PORTC 2U /*!< EXTI PORT C */ +#define LL_GPIO_AF_EXTI_PORTD 3U /*!< EXTI PORT D */ +#define LL_GPIO_AF_EXTI_PORTE 4U /*!< EXTI PORT E */ +#define LL_GPIO_AF_EXTI_PORTF 5U /*!< EXTI PORT F */ +#define LL_GPIO_AF_EXTI_PORTG 6U /*!< EXTI PORT G */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_EXTI_LINE GPIO EXTI LINE + * @{ + */ +#define LL_GPIO_AF_EXTI_LINE0 (0x000FU << 16U | 0U) /*!< EXTI_POSITION_0 | EXTICR[0] */ +#define LL_GPIO_AF_EXTI_LINE1 (0x00F0U << 16U | 0U) /*!< EXTI_POSITION_4 | EXTICR[0] */ +#define LL_GPIO_AF_EXTI_LINE2 (0x0F00U << 16U | 0U) /*!< EXTI_POSITION_8 | EXTICR[0] */ +#define LL_GPIO_AF_EXTI_LINE3 (0xF000U << 16U | 0U) /*!< EXTI_POSITION_12 | EXTICR[0] */ +#define LL_GPIO_AF_EXTI_LINE4 (0x000FU << 16U | 1U) /*!< EXTI_POSITION_0 | EXTICR[1] */ +#define LL_GPIO_AF_EXTI_LINE5 (0x00F0U << 16U | 1U) /*!< EXTI_POSITION_4 | EXTICR[1] */ +#define LL_GPIO_AF_EXTI_LINE6 (0x0F00U << 16U | 1U) /*!< EXTI_POSITION_8 | EXTICR[1] */ +#define LL_GPIO_AF_EXTI_LINE7 (0xF000U << 16U | 1U) /*!< EXTI_POSITION_12 | EXTICR[1] */ +#define LL_GPIO_AF_EXTI_LINE8 (0x000FU << 16U | 2U) /*!< EXTI_POSITION_0 | EXTICR[2] */ +#define LL_GPIO_AF_EXTI_LINE9 (0x00F0U << 16U | 2U) /*!< EXTI_POSITION_4 | EXTICR[2] */ +#define LL_GPIO_AF_EXTI_LINE10 (0x0F00U << 16U | 2U) /*!< EXTI_POSITION_8 | EXTICR[2] */ +#define LL_GPIO_AF_EXTI_LINE11 (0xF000U << 16U | 2U) /*!< EXTI_POSITION_12 | EXTICR[2] */ +#define LL_GPIO_AF_EXTI_LINE12 (0x000FU << 16U | 3U) /*!< EXTI_POSITION_0 | EXTICR[3] */ +#define LL_GPIO_AF_EXTI_LINE13 (0x00F0U << 16U | 3U) /*!< EXTI_POSITION_4 | EXTICR[3] */ +#define LL_GPIO_AF_EXTI_LINE14 (0x0F00U << 16U | 3U) /*!< EXTI_POSITION_8 | EXTICR[3] */ +#define LL_GPIO_AF_EXTI_LINE15 (0xF000U << 16U | 3U) /*!< EXTI_POSITION_12 | EXTICR[3] */ +/** + * @} + */ + +/** + * @} + */ + +/* 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 Analog, Floating input, Input with pull-up/pull-down, General purpose Output, + * Alternate function Output. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll CRL CNFy LL_GPIO_SetPinMode + * @rmtoll CRL MODEy LL_GPIO_SetPinMode + * @rmtoll CRH CNFy LL_GPIO_SetPinMode + * @rmtoll CRH 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_ANALOG + * @arg @ref LL_GPIO_MODE_FLOATING + * @arg @ref LL_GPIO_MODE_INPUT + * @arg @ref LL_GPIO_MODE_OUTPUT + * @arg @ref LL_GPIO_MODE_ALTERNATE + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&GPIOx->CRL) + (Pin >> 24))); + MODIFY_REG(*pReg, ((GPIO_CRL_CNF0 | GPIO_CRL_MODE0) << (POSITION_VAL(Pin) * 4U)), (Mode << (POSITION_VAL(Pin) * 4U))); +} + +/** + * @brief Return gpio mode for a dedicated pin on dedicated port. + * @note I/O mode can be Analog, Floating input, Input with pull-up/pull-down, General purpose Output, + * Alternate function Output. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll CRL CNFy LL_GPIO_GetPinMode + * @rmtoll CRL MODEy LL_GPIO_GetPinMode + * @rmtoll CRH CNFy LL_GPIO_GetPinMode + * @rmtoll CRH 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_ANALOG + * @arg @ref LL_GPIO_MODE_FLOATING + * @arg @ref LL_GPIO_MODE_INPUT + * @arg @ref LL_GPIO_MODE_OUTPUT + * @arg @ref LL_GPIO_MODE_ALTERNATE + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&GPIOx->CRL) + (Pin >> 24))); + return (READ_BIT(*pReg, ((GPIO_CRL_CNF0 | GPIO_CRL_MODE0) << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); +} + +/** + * @brief Configure gpio speed for a dedicated pin on dedicated port. + * @note I/O speed can be Low, Medium or Fast 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 CRL MODEy LL_GPIO_SetPinSpeed + * @rmtoll CRH MODEy 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 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Speed) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&GPIOx->CRL) + (Pin >> 24))); + MODIFY_REG(*pReg, (GPIO_CRL_MODE0 << (POSITION_VAL(Pin) * 4U)), + (Speed << (POSITION_VAL(Pin) * 4U))); +} + +/** + * @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 CRL MODEy LL_GPIO_GetPinSpeed + * @rmtoll CRH MODEy 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 + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&GPIOx->CRL) + (Pin >> 24))); + return (READ_BIT(*pReg, (GPIO_CRL_MODE0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); +} + +/** + * @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 CRL MODEy LL_GPIO_SetPinOutputType + * @rmtoll CRH MODEy LL_GPIO_SetPinOutputType + * @param GPIOx GPIO Port + * @param Pin 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 Pin, uint32_t OutputType) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&GPIOx->CRL) + (Pin >> 24))); + MODIFY_REG(*pReg, (GPIO_CRL_CNF0_0 << (POSITION_VAL(Pin) * 4U)), + (OutputType << (POSITION_VAL(Pin) * 4U))); +} + +/** + * @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 CRL MODEy LL_GPIO_GetPinOutputType + * @rmtoll CRH MODEy 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) +{ + register uint32_t *pReg = (uint32_t *)((uint32_t)((uint32_t)(&GPIOx->CRL) + (Pin >> 24))); + return (READ_BIT(*pReg, (GPIO_CRL_CNF0_0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); + +} + +/** + * @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 ODR ODR 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_DOWN + * @arg @ref LL_GPIO_PULL_UP + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) +{ + MODIFY_REG(GPIOx->ODR, (Pin >> GPIO_PIN_MASK_POS), Pull << (POSITION_VAL(Pin >> GPIO_PIN_MASK_POS))); +} + +/** + * @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 ODR ODR 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_DOWN + * @arg @ref LL_GPIO_PULL_UP + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (READ_BIT(GPIOx->ODR, (GPIO_ODR_ODR0 << (POSITION_VAL(Pin >> GPIO_PIN_MASK_POS)))) >> (POSITION_VAL(Pin >> GPIO_PIN_MASK_POS))); +} + +/** + * @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 >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)); + WRITE_REG(GPIOx->LCKR, ((PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)); + WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | ((PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)); + 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 >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)) == ((PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)); +} + +/** + * @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 (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 >> GPIO_PIN_MASK_POS) & 0x0000FFFFU) == ((PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)); +} + +/** + * @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 >> GPIO_PIN_MASK_POS) & 0x0000FFFFU) == ((PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU)); +} + +/** + * @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 >> GPIO_PIN_MASK_POS) & 0x0000FFFFU); +} + +/** + * @brief Set several pins to low level on dedicated gpio port. + * @rmtoll BRR BRy LL_GPIO_ResetOutputPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->BRR, (PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU); +} + +/** + * @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); + uint32_t pinmask = ((PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU); + WRITE_REG(GPIOx->BSRR, ((odr & pinmask) << 16u) | (~odr & pinmask)); +} + +/** + * @} + */ + +/** @defgroup GPIO_AF_REMAPPING Alternate Function Remapping + * @brief This section propose definition to remap the alternate function to some other port/pins. + * @{ + */ + +/** + * @brief Enable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI. + * @rmtoll MAPR SPI1_REMAP LL_GPIO_AF_EnableRemap_SPI1 + * @note ENABLE: Remap (NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_SPI1(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of SPI1 alternate function NSS, SCK, MISO and MOSI. + * @rmtoll MAPR SPI1_REMAP LL_GPIO_AF_DisableRemap_SPI1 + * @note DISABLE: No remap (NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_SPI1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_SPI1_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if SPI1 has been remapped or not + * @rmtoll MAPR SPI1_REMAP LL_GPIO_AF_IsEnabledRemap_SPI1 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_SPI1(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_SPI1_REMAP) == (AFIO_MAPR_SPI1_REMAP)); +} + +/** + * @brief Enable the remapping of I2C1 alternate function SCL and SDA. + * @rmtoll MAPR I2C1_REMAP LL_GPIO_AF_EnableRemap_I2C1 + * @note ENABLE: Remap (SCL/PB8, SDA/PB9) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_I2C1(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_I2C1_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of I2C1 alternate function SCL and SDA. + * @rmtoll MAPR I2C1_REMAP LL_GPIO_AF_DisableRemap_I2C1 + * @note DISABLE: No remap (SCL/PB6, SDA/PB7) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_I2C1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_I2C1_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if I2C1 has been remapped or not + * @rmtoll MAPR I2C1_REMAP LL_GPIO_AF_IsEnabledRemap_I2C1 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_I2C1(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_I2C1_REMAP) == (AFIO_MAPR_I2C1_REMAP)); +} + +/** + * @brief Enable the remapping of USART1 alternate function TX and RX. + * @rmtoll MAPR USART1_REMAP LL_GPIO_AF_EnableRemap_USART1 + * @note ENABLE: Remap (TX/PB6, RX/PB7) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_USART1(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_USART1_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of USART1 alternate function TX and RX. + * @rmtoll MAPR USART1_REMAP LL_GPIO_AF_DisableRemap_USART1 + * @note DISABLE: No remap (TX/PA9, RX/PA10) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_USART1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_USART1_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if USART1 has been remapped or not + * @rmtoll MAPR USART1_REMAP LL_GPIO_AF_IsEnabledRemap_USART1 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_USART1(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_USART1_REMAP) == (AFIO_MAPR_USART1_REMAP)); +} + +/** + * @brief Enable the remapping of USART2 alternate function CTS, RTS, CK, TX and RX. + * @rmtoll MAPR USART2_REMAP LL_GPIO_AF_EnableRemap_USART2 + * @note ENABLE: Remap (CTS/PD3, RTS/PD4, TX/PD5, RX/PD6, CK/PD7) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_USART2(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_USART2_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of USART2 alternate function CTS, RTS, CK, TX and RX. + * @rmtoll MAPR USART2_REMAP LL_GPIO_AF_DisableRemap_USART2 + * @note DISABLE: No remap (CTS/PA0, RTS/PA1, TX/PA2, RX/PA3, CK/PA4) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_USART2(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_USART2_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if USART2 has been remapped or not + * @rmtoll MAPR USART2_REMAP LL_GPIO_AF_IsEnabledRemap_USART2 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_USART2(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_USART2_REMAP) == (AFIO_MAPR_USART2_REMAP)); +} + +#if defined (AFIO_MAPR_USART3_REMAP) +/** + * @brief Enable the remapping of USART3 alternate function CTS, RTS, CK, TX and RX. + * @rmtoll MAPR USART3_REMAP LL_GPIO_AF_EnableRemap_USART3 + * @note ENABLE: Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_USART3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_USART3_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_USART3_REMAP_FULLREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of USART3 alternate function CTS, RTS, CK, TX and RX. + * @rmtoll MAPR USART3_REMAP LL_GPIO_AF_RemapPartial_USART3 + * @note PARTIAL: Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial_USART3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_USART3_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_USART3_REMAP_PARTIALREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Disable the remapping of USART3 alternate function CTS, RTS, CK, TX and RX. + * @rmtoll MAPR USART3_REMAP LL_GPIO_AF_DisableRemap_USART3 + * @note DISABLE: No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_USART3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_USART3_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_USART3_REMAP_NOREMAP | AFIO_MAPR_SWJ_CFG)); +} +#endif + +/** + * @brief Enable the remapping of TIM1 alternate function channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) + * @rmtoll MAPR TIM1_REMAP LL_GPIO_AF_EnableRemap_TIM1 + * @note ENABLE: Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM1_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM1_REMAP_FULLREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of TIM1 alternate function channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) + * @rmtoll MAPR TIM1_REMAP LL_GPIO_AF_RemapPartial_TIM1 + * @note PARTIAL: Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial_TIM1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM1_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM1_REMAP_PARTIALREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Disable the remapping of TIM1 alternate function channels 1 to 4, 1N to 3N, external trigger (ETR) and Break input (BKIN) + * @rmtoll MAPR TIM1_REMAP LL_GPIO_AF_DisableRemap_TIM1 + * @note DISABLE: No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM1_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM1_REMAP_NOREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @rmtoll MAPR TIM2_REMAP LL_GPIO_AF_EnableRemap_TIM2 + * @note ENABLE: Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM2(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM2_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM2_REMAP_FULLREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @rmtoll MAPR TIM2_REMAP LL_GPIO_AF_RemapPartial2_TIM2 + * @note PARTIAL_2: Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial2_TIM2(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM2_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2 | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @rmtoll MAPR TIM2_REMAP LL_GPIO_AF_RemapPartial1_TIM2 + * @note PARTIAL_1: Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial1_TIM2(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM2_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1 | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Disable the remapping of TIM2 alternate function channels 1 to 4 and external trigger (ETR) + * @rmtoll MAPR TIM2_REMAP LL_GPIO_AF_DisableRemap_TIM2 + * @note DISABLE: No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM2(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM2_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM2_REMAP_NOREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of TIM3 alternate function channels 1 to 4 + * @rmtoll MAPR TIM3_REMAP LL_GPIO_AF_EnableRemap_TIM3 + * @note ENABLE: Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) + * @note TIM3_ETR on PE0 is not re-mapped. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM3_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM3_REMAP_FULLREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable the remapping of TIM3 alternate function channels 1 to 4 + * @rmtoll MAPR TIM3_REMAP LL_GPIO_AF_RemapPartial_TIM3 + * @note PARTIAL: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) + * @note TIM3_ETR on PE0 is not re-mapped. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial_TIM3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM3_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM3_REMAP_PARTIALREMAP | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Disable the remapping of TIM3 alternate function channels 1 to 4 + * @rmtoll MAPR TIM3_REMAP LL_GPIO_AF_DisableRemap_TIM3 + * @note DISABLE: No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) + * @note TIM3_ETR on PE0 is not re-mapped. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM3_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_TIM3_REMAP_NOREMAP | AFIO_MAPR_SWJ_CFG)); +} + +#if defined(AFIO_MAPR_TIM4_REMAP) +/** + * @brief Enable the remapping of TIM4 alternate function channels 1 to 4. + * @rmtoll MAPR TIM4_REMAP LL_GPIO_AF_EnableRemap_TIM4 + * @note ENABLE: Full remap (TIM4_CH1/PD12, TIM4_CH2/PD13, TIM4_CH3/PD14, TIM4_CH4/PD15) + * @note TIM4_ETR on PE0 is not re-mapped. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM4(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_TIM4_REMAP | AFIO_MAPR_SWJ_CFG); +} +/** + * @brief Disable the remapping of TIM4 alternate function channels 1 to 4. + * @rmtoll MAPR TIM4_REMAP LL_GPIO_AF_DisableRemap_TIM4 + * @note DISABLE: No remap (TIM4_CH1/PB6, TIM4_CH2/PB7, TIM4_CH3/PB8, TIM4_CH4/PB9) + * @note TIM4_ETR on PE0 is not re-mapped. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM4(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM4_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if TIM4 has been remapped or not + * @rmtoll MAPR TIM4_REMAP LL_GPIO_AF_IsEnabledRemap_TIM4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM4(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_TIM4_REMAP) == (AFIO_MAPR_TIM4_REMAP)); +} +#endif + +#if defined(AFIO_MAPR_CAN_REMAP_REMAP1) + +/** + * @brief Enable or disable the remapping of CAN alternate function CAN_RX and CAN_TX in devices with a single CAN interface. + * @rmtoll MAPR CAN_REMAP LL_GPIO_AF_RemapPartial1_CAN1 + * @note CASE 1: CAN_RX mapped to PA11, CAN_TX mapped to PA12 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial1_CAN1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_CAN_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_CAN_REMAP_REMAP1 | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable or disable the remapping of CAN alternate function CAN_RX and CAN_TX in devices with a single CAN interface. + * @rmtoll MAPR CAN_REMAP LL_GPIO_AF_RemapPartial2_CAN1 + * @note CASE 2: CAN_RX mapped to PB8, CAN_TX mapped to PB9 (not available on 36-pin package) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial2_CAN1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_CAN_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_CAN_REMAP_REMAP2 | AFIO_MAPR_SWJ_CFG)); +} + +/** + * @brief Enable or disable the remapping of CAN alternate function CAN_RX and CAN_TX in devices with a single CAN interface. + * @rmtoll MAPR CAN_REMAP LL_GPIO_AF_RemapPartial3_CAN1 + * @note CASE 3: CAN_RX mapped to PD0, CAN_TX mapped to PD1 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_RemapPartial3_CAN1(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_CAN_REMAP | AFIO_MAPR_SWJ_CFG), (AFIO_MAPR_CAN_REMAP_REMAP3 | AFIO_MAPR_SWJ_CFG)); +} +#endif + +/** + * @brief Enable the remapping of PD0 and PD1. When the HSE oscillator is not used + * (application running on internal 8 MHz RC) PD0 and PD1 can be mapped on OSC_IN and + * OSC_OUT. This is available only on 36, 48 and 64 pins packages (PD0 and PD1 are available + * on 100-pin and 144-pin packages, no need for remapping). + * @rmtoll MAPR PD01_REMAP LL_GPIO_AF_EnableRemap_PD01 + * @note ENABLE: PD0 remapped on OSC_IN, PD1 remapped on OSC_OUT. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_PD01(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_PD01_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of PD0 and PD1. When the HSE oscillator is not used + * (application running on internal 8 MHz RC) PD0 and PD1 can be mapped on OSC_IN and + * OSC_OUT. This is available only on 36, 48 and 64 pins packages (PD0 and PD1 are available + * on 100-pin and 144-pin packages, no need for remapping). + * @rmtoll MAPR PD01_REMAP LL_GPIO_AF_DisableRemap_PD01 + * @note DISABLE: No remapping of PD0 and PD1 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_PD01(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_PD01_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if PD01 has been remapped or not + * @rmtoll MAPR PD01_REMAP LL_GPIO_AF_IsEnabledRemap_PD01 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_PD01(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_PD01_REMAP) == (AFIO_MAPR_PD01_REMAP)); +} + +#if defined(AFIO_MAPR_TIM5CH4_IREMAP) +/** + * @brief Enable the remapping of TIM5CH4. + * @rmtoll MAPR TIM5CH4_IREMAP LL_GPIO_AF_EnableRemap_TIM5CH4 + * @note ENABLE: LSI internal clock is connected to TIM5_CH4 input for calibration purpose. + * @note This function is available only in high density value line devices. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM5CH4(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_TIM5CH4_IREMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of TIM5CH4. + * @rmtoll MAPR TIM5CH4_IREMAP LL_GPIO_AF_DisableRemap_TIM5CH4 + * @note DISABLE: TIM5_CH4 is connected to PA3 + * @note This function is available only in high density value line devices. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM5CH4(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM5CH4_IREMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if TIM5CH4 has been remapped or not + * @rmtoll MAPR TIM5CH4_IREMAP LL_GPIO_AF_IsEnabledRemap_TIM5CH4 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM5CH4(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_TIM5CH4_IREMAP) == (AFIO_MAPR_TIM5CH4_IREMAP)); +} +#endif + +#if defined(AFIO_MAPR_ETH_REMAP) +/** + * @brief Enable the remapping of Ethernet MAC connections with the PHY. + * @rmtoll MAPR ETH_REMAP LL_GPIO_AF_EnableRemap_ETH + * @note ENABLE: Remap (RX_DV-CRS_DV/PD8, RXD0/PD9, RXD1/PD10, RXD2/PD11, RXD3/PD12) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_ETH(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_ETH_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of Ethernet MAC connections with the PHY. + * @rmtoll MAPR ETH_REMAP LL_GPIO_AF_DisableRemap_ETH + * @note DISABLE: No remap (RX_DV-CRS_DV/PA7, RXD0/PC4, RXD1/PC5, RXD2/PB0, RXD3/PB1) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_ETH(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_ETH_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if ETH has been remapped or not + * @rmtoll MAPR ETH_REMAP LL_GPIO_AF_IsEnabledRemap_ETH + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_ETH(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_ETH_REMAP) == (AFIO_MAPR_ETH_REMAP)); +} +#endif + +#if defined(AFIO_MAPR_CAN2_REMAP) + +/** + * @brief Enable the remapping of CAN2 alternate function CAN2_RX and CAN2_TX. + * @rmtoll MAPR CAN2_REMAP LL_GPIO_AF_EnableRemap_CAN2 + * @note ENABLE: Remap (CAN2_RX/PB5, CAN2_TX/PB6) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_CAN2(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_CAN2_REMAP | AFIO_MAPR_SWJ_CFG); +} +/** + * @brief Disable the remapping of CAN2 alternate function CAN2_RX and CAN2_TX. + * @rmtoll MAPR CAN2_REMAP LL_GPIO_AF_DisableRemap_CAN2 + * @note DISABLE: No remap (CAN2_RX/PB12, CAN2_TX/PB13) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_CAN2(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_CAN2_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if CAN2 has been remapped or not + * @rmtoll MAPR CAN2_REMAP LL_GPIO_AF_IsEnabledRemap_CAN2 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_CAN2(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_CAN2_REMAP) == (AFIO_MAPR_CAN2_REMAP)); +} +#endif + +#if defined(AFIO_MAPR_MII_RMII_SEL) +/** + * @brief Configures the Ethernet MAC internally for use with an external MII or RMII PHY. + * @rmtoll MAPR MII_RMII_SEL LL_GPIO_AF_Select_ETH_RMII + * @note ETH_RMII: Configure Ethernet MAC for connection with an RMII PHY + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Select_ETH_RMII(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_MII_RMII_SEL | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Configures the Ethernet MAC internally for use with an external MII or RMII PHY. + * @rmtoll MAPR MII_RMII_SEL LL_GPIO_AF_Select_ETH_MII + * @note ETH_MII: Configure Ethernet MAC for connection with an MII PHY + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Select_ETH_MII(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_MII_RMII_SEL | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} +#endif + +#if defined(AFIO_MAPR_ADC1_ETRGINJ_REMAP) +/** + * @brief Enable the remapping of ADC1_ETRGINJ (ADC 1 External trigger injected conversion). + * @rmtoll MAPR ADC1_ETRGINJ_REMAP LL_GPIO_AF_EnableRemap_ADC1_ETRGINJ + * @note ENABLE: ADC1 External Event injected conversion is connected to TIM8 Channel4. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_ADC1_ETRGINJ(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_ADC1_ETRGINJ_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of ADC1_ETRGINJ (ADC 1 External trigger injected conversion). + * @rmtoll MAPR ADC1_ETRGINJ_REMAP LL_GPIO_AF_DisableRemap_ADC1_ETRGINJ + * @note DISABLE: ADC1 External trigger injected conversion is connected to EXTI15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_ADC1_ETRGINJ(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_ADC1_ETRGINJ_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if ADC1_ETRGINJ has been remapped or not + * @rmtoll MAPR ADC1_ETRGINJ_REMAP LL_GPIO_AF_IsEnabledRemap_ADC1_ETRGINJ + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_ADC1_ETRGINJ(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_ADC1_ETRGINJ_REMAP) == (AFIO_MAPR_ADC1_ETRGINJ_REMAP)); +} +#endif + +#if defined(AFIO_MAPR_ADC1_ETRGREG_REMAP) +/** + * @brief Enable the remapping of ADC1_ETRGREG (ADC 1 External trigger regular conversion). + * @rmtoll MAPR ADC1_ETRGREG_REMAP LL_GPIO_AF_EnableRemap_ADC1_ETRGREG + * @note ENABLE: ADC1 External Event regular conversion is connected to TIM8 TRG0. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_ADC1_ETRGREG(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_ADC1_ETRGREG_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of ADC1_ETRGREG (ADC 1 External trigger regular conversion). + * @rmtoll MAPR ADC1_ETRGREG_REMAP LL_GPIO_AF_DisableRemap_ADC1_ETRGREG + * @note DISABLE: ADC1 External trigger regular conversion is connected to EXTI11 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_ADC1_ETRGREG(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_ADC1_ETRGREG_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if ADC1_ETRGREG has been remapped or not + * @rmtoll MAPR ADC1_ETRGREG_REMAP LL_GPIO_AF_IsEnabledRemap_ADC1_ETRGREG + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_ADC1_ETRGREG(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_ADC1_ETRGREG_REMAP) == (AFIO_MAPR_ADC1_ETRGREG_REMAP)); +} +#endif + +#if defined(AFIO_MAPR_ADC2_ETRGINJ_REMAP) + +/** + * @brief Enable the remapping of ADC2_ETRGREG (ADC 2 External trigger injected conversion). + * @rmtoll MAPR ADC2_ETRGINJ_REMAP LL_GPIO_AF_EnableRemap_ADC2_ETRGINJ + * @note ENABLE: ADC2 External Event injected conversion is connected to TIM8 Channel4. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_ADC2_ETRGINJ(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_ADC2_ETRGINJ_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of ADC2_ETRGREG (ADC 2 External trigger injected conversion). + * @rmtoll MAPR ADC2_ETRGINJ_REMAP LL_GPIO_AF_DisableRemap_ADC2_ETRGINJ + * @note DISABLE: ADC2 External trigger injected conversion is connected to EXTI15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_ADC2_ETRGINJ(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_ADC2_ETRGINJ_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if ADC2_ETRGINJ has been remapped or not + * @rmtoll MAPR ADC2_ETRGINJ_REMAP LL_GPIO_AF_IsEnabledRemap_ADC2_ETRGINJ + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_ADC2_ETRGINJ(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_ADC2_ETRGINJ_REMAP) == (AFIO_MAPR_ADC2_ETRGINJ_REMAP)); +} +#endif + +#if defined (AFIO_MAPR_ADC2_ETRGREG_REMAP) + +/** + * @brief Enable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @rmtoll MAPR ADC2_ETRGREG_REMAP LL_GPIO_AF_EnableRemap_ADC2_ETRGREG + * @note ENABLE: ADC2 External Event regular conversion is connected to TIM8 TRG0. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_ADC2_ETRGREG(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_ADC2_ETRGREG_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @rmtoll MAPR ADC2_ETRGREG_REMAP LL_GPIO_AF_DisableRemap_ADC2_ETRGREG + * @note DISABLE: ADC2 External trigger regular conversion is connected to EXTI11 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_ADC2_ETRGREG(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_ADC2_ETRGREG_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if ADC2_ETRGREG has been remapped or not + * @rmtoll MAPR ADC2_ETRGREG_REMAP LL_GPIO_AF_IsEnabledRemap_ADC2_ETRGREG + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_ADC2_ETRGREG(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_ADC2_ETRGREG_REMAP) == (AFIO_MAPR_ADC2_ETRGREG_REMAP)); +} +#endif + +/** + * @brief Enable the Serial wire JTAG configuration + * @rmtoll MAPR SWJ_CFG LL_GPIO_AF_EnableRemap_SWJ + * @note ENABLE: Full SWJ (JTAG-DP + SW-DP): Reset State + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_SWJ(void) +{ + MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_RESET); +} + +/** + * @brief Enable the Serial wire JTAG configuration + * @rmtoll MAPR SWJ_CFG LL_GPIO_AF_Remap_SWJ_NONJTRST + * @note NONJTRST: Full SWJ (JTAG-DP + SW-DP) but without NJTRST + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Remap_SWJ_NONJTRST(void) +{ + MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_NOJNTRST); +} + +/** + * @brief Enable the Serial wire JTAG configuration + * @rmtoll MAPR SWJ_CFG LL_GPIO_AF_Remap_SWJ_NOJTAG + * @note NOJTAG: JTAG-DP Disabled and SW-DP Enabled + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Remap_SWJ_NOJTAG(void) +{ + MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_JTAGDISABLE); +} + +/** + * @brief Disable the Serial wire JTAG configuration + * @rmtoll MAPR SWJ_CFG LL_GPIO_AF_DisableRemap_SWJ + * @note DISABLE: JTAG-DP Disabled and SW-DP Disabled + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_SWJ(void) +{ + MODIFY_REG(AFIO->MAPR, AFIO_MAPR_SWJ_CFG, AFIO_MAPR_SWJ_CFG_DISABLE); +} + +#if defined(AFIO_MAPR_SPI3_REMAP) + +/** + * @brief Enable the remapping of SPI3 alternate functions SPI3_NSS/I2S3_WS, SPI3_SCK/I2S3_CK, SPI3_MISO, SPI3_MOSI/I2S3_SD. + * @rmtoll MAPR SPI3_REMAP LL_GPIO_AF_EnableRemap_SPI3 + * @note ENABLE: Remap (SPI3_NSS-I2S3_WS/PA4, SPI3_SCK-I2S3_CK/PC10, SPI3_MISO/PC11, SPI3_MOSI-I2S3_SD/PC12) + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_SPI3(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_SPI3_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of SPI3 alternate functions SPI3_NSS/I2S3_WS, SPI3_SCK/I2S3_CK, SPI3_MISO, SPI3_MOSI/I2S3_SD. + * @rmtoll MAPR SPI3_REMAP LL_GPIO_AF_DisableRemap_SPI3 + * @note DISABLE: No remap (SPI3_NSS-I2S3_WS/PA15, SPI3_SCK-I2S3_CK/PB3, SPI3_MISO/PB4, SPI3_MOSI-I2S3_SD/PB5). + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_SPI3(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_SPI3_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Check if SPI3 has been remapped or not + * @rmtoll MAPR SPI3_REMAP LL_GPIO_AF_IsEnabledRemap_SPI3_REMAP + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_SPI3(void) +{ + return (READ_BIT(AFIO->MAPR, AFIO_MAPR_SPI3_REMAP) == (AFIO_MAPR_SPI3_REMAP)); +} +#endif + +#if defined(AFIO_MAPR_TIM2ITR1_IREMAP) + +/** + * @brief Control of TIM2_ITR1 internal mapping. + * @rmtoll MAPR TIM2ITR1_IREMAP LL_GPIO_AF_Remap_TIM2ITR1_TO_USB + * @note TO_USB: Connect USB OTG SOF (Start of Frame) output to TIM2_ITR1 for calibration purposes. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Remap_TIM2ITR1_TO_USB(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_TIM2ITR1_IREMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Control of TIM2_ITR1 internal mapping. + * @rmtoll MAPR TIM2ITR1_IREMAP LL_GPIO_AF_Remap_TIM2ITR1_TO_ETH + * @note TO_ETH: Connect TIM2_ITR1 internally to the Ethernet PTP output for calibration purposes. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Remap_TIM2ITR1_TO_ETH(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_TIM2ITR1_IREMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} +#endif + +#if defined(AFIO_MAPR_PTP_PPS_REMAP) + +/** + * @brief Enable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @rmtoll MAPR PTP_PPS_REMAP LL_GPIO_AF_EnableRemap_ETH_PTP_PPS + * @note ENABLE: PTP_PPS is output on PB5 pin. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_ETH_PTP_PPS(void) +{ + SET_BIT(AFIO->MAPR, AFIO_MAPR_PTP_PPS_REMAP | AFIO_MAPR_SWJ_CFG); +} + +/** + * @brief Disable the remapping of ADC2_ETRGREG (ADC 2 External trigger regular conversion). + * @rmtoll MAPR PTP_PPS_REMAP LL_GPIO_AF_DisableRemap_ETH_PTP_PPS + * @note DISABLE: PTP_PPS not output on PB5 pin. + * @note This bit is available only in connectivity line devices and is reserved otherwise. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_ETH_PTP_PPS(void) +{ + MODIFY_REG(AFIO->MAPR, (AFIO_MAPR_PTP_PPS_REMAP | AFIO_MAPR_SWJ_CFG), AFIO_MAPR_SWJ_CFG); +} +#endif + +#if defined(AFIO_MAPR2_TIM9_REMAP) + +/** + * @brief Enable the remapping of TIM9_CH1 and TIM9_CH2. + * @rmtoll MAPR2 TIM9_REMAP LL_GPIO_AF_EnableRemap_TIM9 + * @note ENABLE: Remap (TIM9_CH1 on PE5 and TIM9_CH2 on PE6). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM9(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM9_REMAP); +} + +/** + * @brief Disable the remapping of TIM9_CH1 and TIM9_CH2. + * @rmtoll MAPR2 TIM9_REMAP LL_GPIO_AF_DisableRemap_TIM9 + * @note DISABLE: No remap (TIM9_CH1 on PA2 and TIM9_CH2 on PA3). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM9(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM9_REMAP); +} + +/** + * @brief Check if TIM9_CH1 and TIM9_CH2 have been remapped or not + * @rmtoll MAPR2 TIM9_REMAP LL_GPIO_AF_IsEnabledRemap_TIM9 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM9(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM9_REMAP) == (AFIO_MAPR2_TIM9_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM10_REMAP) + +/** + * @brief Enable the remapping of TIM10_CH1. + * @rmtoll MAPR2 TIM10_REMAP LL_GPIO_AF_EnableRemap_TIM10 + * @note ENABLE: Remap (TIM10_CH1 on PF6). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM10(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM10_REMAP); +} + +/** + * @brief Disable the remapping of TIM10_CH1. + * @rmtoll MAPR2 TIM10_REMAP LL_GPIO_AF_DisableRemap_TIM10 + * @note DISABLE: No remap (TIM10_CH1 on PB8). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM10(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM10_REMAP); +} + +/** + * @brief Check if TIM10_CH1 has been remapped or not + * @rmtoll MAPR2 TIM10_REMAP LL_GPIO_AF_IsEnabledRemap_TIM10 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM10(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM10_REMAP) == (AFIO_MAPR2_TIM10_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM11_REMAP) +/** + * @brief Enable the remapping of TIM11_CH1. + * @rmtoll MAPR2 TIM11_REMAP LL_GPIO_AF_EnableRemap_TIM11 + * @note ENABLE: Remap (TIM11_CH1 on PF7). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM11(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM11_REMAP); +} + +/** + * @brief Disable the remapping of TIM11_CH1. + * @rmtoll MAPR2 TIM11_REMAP LL_GPIO_AF_DisableRemap_TIM11 + * @note DISABLE: No remap (TIM11_CH1 on PB9). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM11(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM11_REMAP); +} + +/** + * @brief Check if TIM11_CH1 has been remapped or not + * @rmtoll MAPR2 TIM11_REMAP LL_GPIO_AF_IsEnabledRemap_TIM11 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM11(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM11_REMAP) == (AFIO_MAPR2_TIM11_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM13_REMAP) + +/** + * @brief Enable the remapping of TIM13_CH1. + * @rmtoll MAPR2 TIM13_REMAP LL_GPIO_AF_EnableRemap_TIM13 + * @note ENABLE: Remap STM32F100:(TIM13_CH1 on PF8). Others:(TIM13_CH1 on PB0). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM13(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM13_REMAP); +} + +/** + * @brief Disable the remapping of TIM13_CH1. + * @rmtoll MAPR2 TIM13_REMAP LL_GPIO_AF_DisableRemap_TIM13 + * @note DISABLE: No remap STM32F100:(TIM13_CH1 on PA6). Others:(TIM13_CH1 on PC8). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM13(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM13_REMAP); +} + +/** + * @brief Check if TIM13_CH1 has been remapped or not + * @rmtoll MAPR2 TIM13_REMAP LL_GPIO_AF_IsEnabledRemap_TIM13 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM13(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM13_REMAP) == (AFIO_MAPR2_TIM13_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM14_REMAP) + +/** + * @brief Enable the remapping of TIM14_CH1. + * @rmtoll MAPR2 TIM14_REMAP LL_GPIO_AF_EnableRemap_TIM14 + * @note ENABLE: Remap STM32F100:(TIM14_CH1 on PB1). Others:(TIM14_CH1 on PF9). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM14(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM14_REMAP); +} + +/** + * @brief Disable the remapping of TIM14_CH1. + * @rmtoll MAPR2 TIM14_REMAP LL_GPIO_AF_DisableRemap_TIM14 + * @note DISABLE: No remap STM32F100:(TIM14_CH1 on PC9). Others:(TIM14_CH1 on PA7). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM14(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM14_REMAP); +} + +/** + * @brief Check if TIM14_CH1 has been remapped or not + * @rmtoll MAPR2 TIM14_REMAP LL_GPIO_AF_IsEnabledRemap_TIM14 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM14(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM14_REMAP) == (AFIO_MAPR2_TIM14_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_FSMC_NADV_REMAP) + +/** + * @brief Controls the use of the optional FSMC_NADV signal. + * @rmtoll MAPR2 FSMC_NADV LL_GPIO_AF_Disconnect_FSMCNADV + * @note DISCONNECTED: The NADV signal is not connected. The I/O pin can be used by another peripheral. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Disconnect_FSMCNADV(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_FSMC_NADV_REMAP); +} + +/** + * @brief Controls the use of the optional FSMC_NADV signal. + * @rmtoll MAPR2 FSMC_NADV LL_GPIO_AF_Connect_FSMCNADV + * @note CONNECTED: The NADV signal is connected to the output (default). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_Connect_FSMCNADV(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_FSMC_NADV_REMAP); +} +#endif + +#if defined(AFIO_MAPR2_TIM15_REMAP) + +/** + * @brief Enable the remapping of TIM15_CH1 and TIM15_CH2. + * @rmtoll MAPR2 TIM15_REMAP LL_GPIO_AF_EnableRemap_TIM15 + * @note ENABLE: Remap (TIM15_CH1 on PB14 and TIM15_CH2 on PB15). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM15(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM15_REMAP); +} +/** + * @brief Disable the remapping of TIM15_CH1 and TIM15_CH2. + * @rmtoll MAPR2 TIM15_REMAP LL_GPIO_AF_DisableRemap_TIM15 + * @note DISABLE: No remap (TIM15_CH1 on PA2 and TIM15_CH2 on PA3). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM15(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM15_REMAP); +} + +/** + * @brief Check if TIM15_CH1 has been remapped or not + * @rmtoll MAPR2 TIM15_REMAP LL_GPIO_AF_IsEnabledRemap_TIM15 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM15(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM15_REMAP) == (AFIO_MAPR2_TIM15_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM16_REMAP) + +/** + * @brief Enable the remapping of TIM16_CH1. + * @rmtoll MAPR2 TIM16_REMAP LL_GPIO_AF_EnableRemap_TIM16 + * @note ENABLE: Remap (TIM16_CH1 on PA6). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM16(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM16_REMAP); +} + +/** + * @brief Disable the remapping of TIM16_CH1. + * @rmtoll MAPR2 TIM16_REMAP LL_GPIO_AF_DisableRemap_TIM16 + * @note DISABLE: No remap (TIM16_CH1 on PB8). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM16(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM16_REMAP); +} + +/** + * @brief Check if TIM16_CH1 has been remapped or not + * @rmtoll MAPR2 TIM16_REMAP LL_GPIO_AF_IsEnabledRemap_TIM16 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM16(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM16_REMAP) == (AFIO_MAPR2_TIM16_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM17_REMAP) + +/** + * @brief Enable the remapping of TIM17_CH1. + * @rmtoll MAPR2 TIM17_REMAP LL_GPIO_AF_EnableRemap_TIM17 + * @note ENABLE: Remap (TIM17_CH1 on PA7). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM17(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM17_REMAP); +} + +/** + * @brief Disable the remapping of TIM17_CH1. + * @rmtoll MAPR2 TIM17_REMAP LL_GPIO_AF_DisableRemap_TIM17 + * @note DISABLE: No remap (TIM17_CH1 on PB9). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM17(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM17_REMAP); +} + +/** + * @brief Check if TIM17_CH1 has been remapped or not + * @rmtoll MAPR2 TIM17_REMAP LL_GPIO_AF_IsEnabledRemap_TIM17 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM17(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM17_REMAP) == (AFIO_MAPR2_TIM17_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_CEC_REMAP) + +/** + * @brief Enable the remapping of CEC. + * @rmtoll MAPR2 CEC_REMAP LL_GPIO_AF_EnableRemap_CEC + * @note ENABLE: Remap (CEC on PB10). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_CEC(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_CEC_REMAP); +} + +/** + * @brief Disable the remapping of CEC. + * @rmtoll MAPR2 CEC_REMAP LL_GPIO_AF_DisableRemap_CEC + * @note DISABLE: No remap (CEC on PB8). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_CEC(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_CEC_REMAP); +} + +/** + * @brief Check if CEC has been remapped or not + * @rmtoll MAPR2 CEC_REMAP LL_GPIO_AF_IsEnabledRemap_CEC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_CEC(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_CEC_REMAP) == (AFIO_MAPR2_CEC_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM1_DMA_REMAP) + +/** + * @brief Controls the mapping of the TIM1_CH1 TIM1_CH2 DMA requests onto the DMA1 channels. + * @rmtoll MAPR2 TIM1_DMA_REMAP LL_GPIO_AF_EnableRemap_TIM1DMA + * @note ENABLE: Remap (TIM1_CH1 DMA request/DMA1 Channel6, TIM1_CH2 DMA request/DMA1 Channel6) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM1DMA(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM1_DMA_REMAP); +} + +/** + * @brief Controls the mapping of the TIM1_CH1 TIM1_CH2 DMA requests onto the DMA1 channels. + * @rmtoll MAPR2 TIM1_DMA_REMAP LL_GPIO_AF_DisableRemap_TIM1DMA + * @note DISABLE: No remap (TIM1_CH1 DMA request/DMA1 Channel2, TIM1_CH2 DMA request/DMA1 Channel3). + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM1DMA(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM1_DMA_REMAP); +} + +/** + * @brief Check if TIM1DMA has been remapped or not + * @rmtoll MAPR2 TIM1_DMA_REMAP LL_GPIO_AF_IsEnabledRemap_TIM1DMA + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM1DMA(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM1_DMA_REMAP) == (AFIO_MAPR2_TIM1_DMA_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM67_DAC_DMA_REMAP) + +/** + * @brief Controls the mapping of the TIM6_DAC1 and TIM7_DAC2 DMA requests onto the DMA1 channels. + * @rmtoll MAPR2 TIM76_DAC_DMA_REMAP LL_GPIO_AF_EnableRemap_TIM67DACDMA + * @note ENABLE: Remap (TIM6_DAC1 DMA request/DMA1 Channel3, TIM7_DAC2 DMA request/DMA1 Channel4) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM67DACDMA(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM67_DAC_DMA_REMAP); +} + +/** + * @brief Controls the mapping of the TIM6_DAC1 and TIM7_DAC2 DMA requests onto the DMA1 channels. + * @rmtoll MAPR2 TIM76_DAC_DMA_REMAP LL_GPIO_AF_DisableRemap_TIM67DACDMA + * @note DISABLE: No remap (TIM6_DAC1 DMA request/DMA2 Channel3, TIM7_DAC2 DMA request/DMA2 Channel4) + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM67DACDMA(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM67_DAC_DMA_REMAP); +} + +/** + * @brief Check if TIM67DACDMA has been remapped or not + * @rmtoll MAPR2 TIM76_DAC_DMA_REMAP LL_GPIO_AF_IsEnabledRemap_TIM67DACDMA + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM67DACDMA(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM67_DAC_DMA_REMAP) == (AFIO_MAPR2_TIM67_DAC_DMA_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_TIM12_REMAP) + +/** + * @brief Enable the remapping of TIM12_CH1 and TIM12_CH2. + * @rmtoll MAPR2 TIM12_REMAP LL_GPIO_AF_EnableRemap_TIM12 + * @note ENABLE: Remap (TIM12_CH1 on PB12 and TIM12_CH2 on PB13). + * @note This bit is available only in high density value line devices. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_TIM12(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM12_REMAP); +} + +/** + * @brief Disable the remapping of TIM12_CH1 and TIM12_CH2. + * @rmtoll MAPR2 TIM12_REMAP LL_GPIO_AF_DisableRemap_TIM12 + * @note DISABLE: No remap (TIM12_CH1 on PC4 and TIM12_CH2 on PC5). + * @note This bit is available only in high density value line devices. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_TIM12(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM12_REMAP); +} + +/** + * @brief Check if TIM12_CH1 has been remapped or not + * @rmtoll MAPR2 TIM12_REMAP LL_GPIO_AF_IsEnabledRemap_TIM12 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_TIM12(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_TIM12_REMAP) == (AFIO_MAPR2_TIM12_REMAP)); +} +#endif + +#if defined(AFIO_MAPR2_MISC_REMAP) + +/** + * @brief Miscellaneous features remapping. + * This bit is set and cleared by software. It controls miscellaneous features. + * The DMA2 channel 5 interrupt position in the vector table. + * The timer selection for DAC trigger 3 (TSEL[2:0] = 011, for more details refer to the DAC_CR register). + * @rmtoll MAPR2 MISC_REMAP LL_GPIO_AF_EnableRemap_MISC + * @note ENABLE: DMA2 channel 5 interrupt is mapped separately at position 60 and TIM15 TRGO event is + * selected as DAC Trigger 3, TIM15 triggers TIM1/3. + * @note This bit is available only in high density value line devices. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableRemap_MISC(void) +{ + SET_BIT(AFIO->MAPR2, AFIO_MAPR2_MISC_REMAP); +} + +/** + * @brief Miscellaneous features remapping. + * This bit is set and cleared by software. It controls miscellaneous features. + * The DMA2 channel 5 interrupt position in the vector table. + * The timer selection for DAC trigger 3 (TSEL[2:0] = 011, for more details refer to the DAC_CR register). + * @rmtoll MAPR2 MISC_REMAP LL_GPIO_AF_DisableRemap_MISC + * @note DISABLE: DMA2 channel 5 interrupt is mapped with DMA2 channel 4 at position 59, TIM5 TRGO + * event is selected as DAC Trigger 3, TIM5 triggers TIM1/3. + * @note This bit is available only in high density value line devices. + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableRemap_MISC(void) +{ + CLEAR_BIT(AFIO->MAPR2, AFIO_MAPR2_MISC_REMAP); +} + +/** + * @brief Check if MISC has been remapped or not + * @rmtoll MAPR2 MISC_REMAP LL_GPIO_AF_IsEnabledRemap_MISC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_IsEnabledRemap_MISC(void) +{ + return (READ_BIT(AFIO->MAPR2, AFIO_MAPR2_MISC_REMAP) == (AFIO_MAPR2_MISC_REMAP)); +} +#endif + +/** + * @} + */ + +/** @defgroup GPIO_AF_LL_EVENTOUT Output Event configuration + * @brief This section propose definition to Configure EVENTOUT Cortex feature . + * @{ + */ + +/** + * @brief Configures the port and pin on which the EVENTOUT Cortex signal will be connected. + * @rmtoll EVCR PORT LL_GPIO_AF_ConfigEventout\n + * EVCR PIN LL_GPIO_AF_ConfigEventout + * @param LL_GPIO_PortSource This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_EVENTOUT_PORT_A + * @arg @ref LL_GPIO_AF_EVENTOUT_PORT_B + * @arg @ref LL_GPIO_AF_EVENTOUT_PORT_C + * @arg @ref LL_GPIO_AF_EVENTOUT_PORT_D + * @arg @ref LL_GPIO_AF_EVENTOUT_PORT_E + * @param LL_GPIO_PinSource This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_0 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_1 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_2 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_3 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_4 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_5 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_6 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_7 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_8 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_9 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_10 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_11 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_12 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_13 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_14 + * @arg @ref LL_GPIO_AF_EVENTOUT_PIN_15 + * @retval None +*/ +__STATIC_INLINE void LL_GPIO_AF_ConfigEventout(uint32_t LL_GPIO_PortSource, uint32_t LL_GPIO_PinSource) +{ + MODIFY_REG(AFIO->EVCR, (AFIO_EVCR_PORT) | (AFIO_EVCR_PIN), (LL_GPIO_PortSource) | (LL_GPIO_PinSource)); +} + +/** + * @brief Enables the Event Output. + * @rmtoll EVCR EVOE LL_GPIO_AF_EnableEventout + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_EnableEventout(void) +{ + SET_BIT(AFIO->EVCR, AFIO_EVCR_EVOE); +} + +/** + * @brief Disables the Event Output. + * @rmtoll EVCR EVOE LL_GPIO_AF_DisableEventout + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_DisableEventout(void) +{ + CLEAR_BIT(AFIO->EVCR, AFIO_EVCR_EVOE); +} + +/** + * @} + */ +/** @defgroup GPIO_AF_LL_EXTI EXTI external interrupt + * @brief This section Configure source input for the EXTI external interrupt . + * @{ + */ + +/** + * @brief Configure source input for the EXTI external interrupt. + * @rmtoll AFIO_EXTICR1 EXTIx LL_GPIO_AF_SetEXTISource\n + * AFIO_EXTICR2 EXTIx LL_GPIO_AF_SetEXTISource\n + * AFIO_EXTICR3 EXTIx LL_GPIO_AF_SetEXTISource\n + * AFIO_EXTICR4 EXTIx LL_GPIO_AF_SetEXTISource + * @param Port This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_EXTI_PORTA + * @arg @ref LL_GPIO_AF_EXTI_PORTB + * @arg @ref LL_GPIO_AF_EXTI_PORTC + * @arg @ref LL_GPIO_AF_EXTI_PORTD + * @arg @ref LL_GPIO_AF_EXTI_PORTE + * @arg @ref LL_GPIO_AF_EXTI_PORTF + * @arg @ref LL_GPIO_AF_EXTI_PORTG + * @param Line This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_EXTI_LINE0 + * @arg @ref LL_GPIO_AF_EXTI_LINE1 + * @arg @ref LL_GPIO_AF_EXTI_LINE2 + * @arg @ref LL_GPIO_AF_EXTI_LINE3 + * @arg @ref LL_GPIO_AF_EXTI_LINE4 + * @arg @ref LL_GPIO_AF_EXTI_LINE5 + * @arg @ref LL_GPIO_AF_EXTI_LINE6 + * @arg @ref LL_GPIO_AF_EXTI_LINE7 + * @arg @ref LL_GPIO_AF_EXTI_LINE8 + * @arg @ref LL_GPIO_AF_EXTI_LINE9 + * @arg @ref LL_GPIO_AF_EXTI_LINE10 + * @arg @ref LL_GPIO_AF_EXTI_LINE11 + * @arg @ref LL_GPIO_AF_EXTI_LINE12 + * @arg @ref LL_GPIO_AF_EXTI_LINE13 + * @arg @ref LL_GPIO_AF_EXTI_LINE14 + * @arg @ref LL_GPIO_AF_EXTI_LINE15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_AF_SetEXTISource(uint32_t Port, uint32_t Line) +{ + MODIFY_REG(AFIO->EXTICR[Line & 0xFF], (Line >> 16), Port << POSITION_VAL((Line >> 16))); +} + +/** + * @brief Get the configured defined for specific EXTI Line + * @rmtoll AFIO_EXTICR1 EXTIx LL_GPIO_AF_GetEXTISource\n + * AFIO_EXTICR2 EXTIx LL_GPIO_AF_GetEXTISource\n + * AFIO_EXTICR3 EXTIx LL_GPIO_AF_GetEXTISource\n + * AFIO_EXTICR4 EXTIx LL_GPIO_AF_GetEXTISource + * @param Line This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_EXTI_LINE0 + * @arg @ref LL_GPIO_AF_EXTI_LINE1 + * @arg @ref LL_GPIO_AF_EXTI_LINE2 + * @arg @ref LL_GPIO_AF_EXTI_LINE3 + * @arg @ref LL_GPIO_AF_EXTI_LINE4 + * @arg @ref LL_GPIO_AF_EXTI_LINE5 + * @arg @ref LL_GPIO_AF_EXTI_LINE6 + * @arg @ref LL_GPIO_AF_EXTI_LINE7 + * @arg @ref LL_GPIO_AF_EXTI_LINE8 + * @arg @ref LL_GPIO_AF_EXTI_LINE9 + * @arg @ref LL_GPIO_AF_EXTI_LINE10 + * @arg @ref LL_GPIO_AF_EXTI_LINE11 + * @arg @ref LL_GPIO_AF_EXTI_LINE12 + * @arg @ref LL_GPIO_AF_EXTI_LINE13 + * @arg @ref LL_GPIO_AF_EXTI_LINE14 + * @arg @ref LL_GPIO_AF_EXTI_LINE15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_AF_EXTI_PORTA + * @arg @ref LL_GPIO_AF_EXTI_PORTB + * @arg @ref LL_GPIO_AF_EXTI_PORTC + * @arg @ref LL_GPIO_AF_EXTI_PORTD + * @arg @ref LL_GPIO_AF_EXTI_PORTE + * @arg @ref LL_GPIO_AF_EXTI_PORTF + * @arg @ref LL_GPIO_AF_EXTI_PORTG + */ +__STATIC_INLINE uint32_t LL_GPIO_AF_GetEXTISource(uint32_t Line) +{ + return (uint32_t)(READ_BIT(AFIO->EXTICR[Line & 0xFF], (Line >> 16)) >> POSITION_VAL(Line >> 16)); +} + +/** + * @} + */ + +#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) */ +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F1xx_LL_GPIO_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_pwr.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_pwr.h new file mode 100644 index 0000000..f912a16 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_pwr.h @@ -0,0 +1,437 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_pwr.h + * @author MCD Application Team + * @brief Header file of PWR 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 __STM32F1xx_LL_PWR_H +#define __STM32F1xx_LL_PWR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_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_EWUP1 PWR_CSR_EWUP /*!< Enable WKUP pin 1 */ +/** + * @} + */ + + +/** @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 */ +#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 + * @{ + */ +#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP) /*!< WKUP pin 1 : PA0 */ +/** + * @} + */ + +/** + * @} + */ + + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Macros PWR Exported Macros + * @{ + */ + +/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in PWR register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) + +/** + * @brief Read a value in PWR register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_LL_EF_Configuration Configuration + * @{ + */ + +/** + * @brief Enable access to the backup domain + * @rmtoll CR DBP LL_PWR_EnableBkUpAccess + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableBkUpAccess(void) +{ + SET_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Disable access to the backup domain + * @rmtoll CR DBP LL_PWR_DisableBkUpAccess + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableBkUpAccess(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Check if the backup domain is enabled + * @rmtoll CR DBP LL_PWR_IsEnabledBkUpAccess + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpAccess(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_DBP) == (PWR_CR_DBP)); +} + +/** + * @brief Set voltage Regulator mode during 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 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_STANDBY + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) +{ + MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); +} + +/** + * @brief Get Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS 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_STANDBY + */ +__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); +} + +/** + * @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 + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @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 + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @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 + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @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 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 Clear Standby Flag + * @rmtoll CR CSBF LL_PWR_ClearFlag_SB + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_SB(void) +{ + SET_BIT(PWR->CR, PWR_CR_CSBF); +} + +/** + * @brief Clear Wake-up Flags + * @rmtoll CR CWUF LL_PWR_ClearFlag_WU + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_WU(void) +{ + SET_BIT(PWR->CR, PWR_CR_CWUF); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup PWR_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_PWR_DeInit(void); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(PWR) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_LL_PWR_H */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_rcc.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_rcc.h new file mode 100644 index 0000000..97a6390 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_rcc.h @@ -0,0 +1,2309 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_rcc.h + * @author MCD Application Team + * @brief Header file of RCC 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 __STM32F1xx_LL_RCC_H +#define __STM32F1xx_LL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup RCC_LL RCC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* 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 8000000U /*!< Value of the HSE oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) +#define HSI_VALUE 8000000U /*!< 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 40000U /*!< Value of the LSI oscillator in Hz */ +#endif /* LSI_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 */ +#define LL_RCC_CIR_PLL3RDYC RCC_CIR_PLL3RDYC /*!< PLL3(PLLI2S) Ready Interrupt Clear */ +#define LL_RCC_CIR_PLL2RDYC RCC_CIR_PLL2RDYC /*!< PLL2 Ready Interrupt Clear */ +#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 */ +#define LL_RCC_CIR_PLL3RDYF RCC_CIR_PLL3RDYF /*!< PLL3(PLLI2S) Ready Interrupt flag */ +#define LL_RCC_CIR_PLL2RDYF RCC_CIR_PLL2RDYF /*!< PLL2 Ready Interrupt flag */ +#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt 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 */ +#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ +/** + * @} + */ + +/** @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 */ +#define LL_RCC_CIR_PLL3RDYIE RCC_CIR_PLL3RDYIE /*!< PLL3(PLLI2S) Ready Interrupt Enable */ +#define LL_RCC_CIR_PLL2RDYIE RCC_CIR_PLL2RDYIE /*!< PLL2 Ready Interrupt Enable */ +/** + * @} + */ + +#if defined(RCC_CFGR2_PREDIV2) +/** @defgroup RCC_LL_EC_HSE_PREDIV2_DIV HSE PREDIV2 Division factor + * @{ + */ +#define LL_RCC_HSE_PREDIV2_DIV_1 RCC_CFGR2_PREDIV2_DIV1 /*!< PREDIV2 input clock not divided */ +#define LL_RCC_HSE_PREDIV2_DIV_2 RCC_CFGR2_PREDIV2_DIV2 /*!< PREDIV2 input clock divided by 2 */ +#define LL_RCC_HSE_PREDIV2_DIV_3 RCC_CFGR2_PREDIV2_DIV3 /*!< PREDIV2 input clock divided by 3 */ +#define LL_RCC_HSE_PREDIV2_DIV_4 RCC_CFGR2_PREDIV2_DIV4 /*!< PREDIV2 input clock divided by 4 */ +#define LL_RCC_HSE_PREDIV2_DIV_5 RCC_CFGR2_PREDIV2_DIV5 /*!< PREDIV2 input clock divided by 5 */ +#define LL_RCC_HSE_PREDIV2_DIV_6 RCC_CFGR2_PREDIV2_DIV6 /*!< PREDIV2 input clock divided by 6 */ +#define LL_RCC_HSE_PREDIV2_DIV_7 RCC_CFGR2_PREDIV2_DIV7 /*!< PREDIV2 input clock divided by 7 */ +#define LL_RCC_HSE_PREDIV2_DIV_8 RCC_CFGR2_PREDIV2_DIV8 /*!< PREDIV2 input clock divided by 8 */ +#define LL_RCC_HSE_PREDIV2_DIV_9 RCC_CFGR2_PREDIV2_DIV9 /*!< PREDIV2 input clock divided by 9 */ +#define LL_RCC_HSE_PREDIV2_DIV_10 RCC_CFGR2_PREDIV2_DIV10 /*!< PREDIV2 input clock divided by 10 */ +#define LL_RCC_HSE_PREDIV2_DIV_11 RCC_CFGR2_PREDIV2_DIV11 /*!< PREDIV2 input clock divided by 11 */ +#define LL_RCC_HSE_PREDIV2_DIV_12 RCC_CFGR2_PREDIV2_DIV12 /*!< PREDIV2 input clock divided by 12 */ +#define LL_RCC_HSE_PREDIV2_DIV_13 RCC_CFGR2_PREDIV2_DIV13 /*!< PREDIV2 input clock divided by 13 */ +#define LL_RCC_HSE_PREDIV2_DIV_14 RCC_CFGR2_PREDIV2_DIV14 /*!< PREDIV2 input clock divided by 14 */ +#define LL_RCC_HSE_PREDIV2_DIV_15 RCC_CFGR2_PREDIV2_DIV15 /*!< PREDIV2 input clock divided by 15 */ +#define LL_RCC_HSE_PREDIV2_DIV_16 RCC_CFGR2_PREDIV2_DIV16 /*!< PREDIV2 input clock divided by 16 */ +/** + * @} + */ + +#endif /* RCC_CFGR2_PREDIV2 */ + +/** @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 */ +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + +/** @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_MCO1SOURCE MCO1 SOURCE selection + * @{ + */ +#define LL_RCC_MCO1SOURCE_NOCLOCK RCC_CFGR_MCO_NOCLOCK /*!< MCO output disabled, no clock on MCO */ +#define LL_RCC_MCO1SOURCE_SYSCLK RCC_CFGR_MCO_SYSCLK /*!< SYSCLK selection as MCO source */ +#define LL_RCC_MCO1SOURCE_HSI RCC_CFGR_MCO_HSI /*!< HSI selection as MCO source */ +#define LL_RCC_MCO1SOURCE_HSE RCC_CFGR_MCO_HSE /*!< HSE selection as MCO source */ +#define LL_RCC_MCO1SOURCE_PLLCLK_DIV_2 RCC_CFGR_MCO_PLLCLK_DIV2 /*!< PLL clock divided by 2*/ +#if defined(RCC_CFGR_MCO_PLL2CLK) +#define LL_RCC_MCO1SOURCE_PLL2CLK RCC_CFGR_MCO_PLL2CLK /*!< PLL2 clock selected as MCO source*/ +#endif /* RCC_CFGR_MCO_PLL2CLK */ +#if defined(RCC_CFGR_MCO_PLL3CLK_DIV2) +#define LL_RCC_MCO1SOURCE_PLLI2SCLK_DIV2 RCC_CFGR_MCO_PLL3CLK_DIV2 /*!< PLLI2S clock divided by 2 selected as MCO source*/ +#endif /* RCC_CFGR_MCO_PLL3CLK_DIV2 */ +#if defined(RCC_CFGR_MCO_EXT_HSE) +#define LL_RCC_MCO1SOURCE_EXT_HSE RCC_CFGR_MCO_EXT_HSE /*!< XT1 external 3-25 MHz oscillator clock selected as MCO source */ +#endif /* RCC_CFGR_MCO_EXT_HSE */ +#if defined(RCC_CFGR_MCO_PLL3CLK) +#define LL_RCC_MCO1SOURCE_PLLI2SCLK RCC_CFGR_MCO_PLL3CLK /*!< PLLI2S clock selected as MCO source */ +#endif /* RCC_CFGR_MCO_PLL3CLK */ +/** + * @} + */ + +#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(RCC_CFGR2_I2S2SRC) +/** @defgroup RCC_LL_EC_I2S2CLKSOURCE Peripheral I2S clock source selection + * @{ + */ +#define LL_RCC_I2S2_CLKSOURCE_SYSCLK RCC_CFGR2_I2S2SRC /*!< System clock (SYSCLK) selected as I2S2 clock entry */ +#define LL_RCC_I2S2_CLKSOURCE_PLLI2S_VCO (uint32_t)(RCC_CFGR2_I2S2SRC | (RCC_CFGR2_I2S2SRC >> 16U)) /*!< PLLI2S VCO clock selected as I2S2 clock entry */ +#define LL_RCC_I2S3_CLKSOURCE_SYSCLK RCC_CFGR2_I2S3SRC /*!< System clock (SYSCLK) selected as I2S3 clock entry */ +#define LL_RCC_I2S3_CLKSOURCE_PLLI2S_VCO (uint32_t)(RCC_CFGR2_I2S3SRC | (RCC_CFGR2_I2S3SRC >> 16U)) /*!< PLLI2S VCO clock selected as I2S3 clock entry */ +/** + * @} + */ +#endif /* RCC_CFGR2_I2S2SRC */ + +#if defined(USB_OTG_FS) || defined(USB) +/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection + * @{ + */ +#if defined(RCC_CFGR_USBPRE) +#define LL_RCC_USB_CLKSOURCE_PLL RCC_CFGR_USBPRE /*!< PLL clock is not divided */ +#define LL_RCC_USB_CLKSOURCE_PLL_DIV_1_5 0x00000000U /*!< PLL clock is divided by 1.5 */ +#endif /*RCC_CFGR_USBPRE*/ +#if defined(RCC_CFGR_OTGFSPRE) +#define LL_RCC_USB_CLKSOURCE_PLL_DIV_2 RCC_CFGR_OTGFSPRE /*!< PLL clock is divided by 2 */ +#define LL_RCC_USB_CLKSOURCE_PLL_DIV_3 0x00000000U /*!< PLL clock is divided by 3 */ +#endif /*RCC_CFGR_OTGFSPRE*/ +/** + * @} + */ +#endif /* USB_OTG_FS || USB */ + +/** @defgroup RCC_LL_EC_ADC_CLKSOURCE_PCLK2 Peripheral ADC clock source selection + * @{ + */ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_2 RCC_CFGR_ADCPRE_DIV2 /*ADC prescaler PCLK2 divided by 2*/ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_4 RCC_CFGR_ADCPRE_DIV4 /*ADC prescaler PCLK2 divided by 4*/ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_6 RCC_CFGR_ADCPRE_DIV6 /*ADC prescaler PCLK2 divided by 6*/ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_8 RCC_CFGR_ADCPRE_DIV8 /*ADC prescaler PCLK2 divided by 8*/ +/** + * @} + */ + +#if defined(RCC_CFGR2_I2S2SRC) +/** @defgroup RCC_LL_EC_I2S2 Peripheral I2S get clock source + * @{ + */ +#define LL_RCC_I2S2_CLKSOURCE RCC_CFGR2_I2S2SRC /*!< I2S2 Clock source selection */ +#define LL_RCC_I2S3_CLKSOURCE RCC_CFGR2_I2S3SRC /*!< I2S3 Clock source selection */ +/** + * @} + */ + +#endif /* RCC_CFGR2_I2S2SRC */ + +#if defined(USB_OTG_FS) || defined(USB) +/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source + * @{ + */ +#define LL_RCC_USB_CLKSOURCE 0x00400000U /*!< USB Clock source selection */ +/** + * @} + */ + +#endif /* USB_OTG_FS || USB */ + +/** @defgroup RCC_LL_EC_ADC Peripheral ADC get clock source + * @{ + */ +#define LL_RCC_ADC_CLKSOURCE RCC_CFGR_ADCPRE /*!< ADC Clock source selection */ +/** + * @} + */ + +/** @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_DIV128 RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by 128 used as RTC clock */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLL_MUL PLL Multiplicator factor + * @{ + */ +#if defined(RCC_CFGR_PLLMULL2) +#define LL_RCC_PLL_MUL_2 RCC_CFGR_PLLMULL2 /*!< PLL input clock*2 */ +#endif /*RCC_CFGR_PLLMULL2*/ +#if defined(RCC_CFGR_PLLMULL3) +#define LL_RCC_PLL_MUL_3 RCC_CFGR_PLLMULL3 /*!< PLL input clock*3 */ +#endif /*RCC_CFGR_PLLMULL3*/ +#define LL_RCC_PLL_MUL_4 RCC_CFGR_PLLMULL4 /*!< PLL input clock*4 */ +#define LL_RCC_PLL_MUL_5 RCC_CFGR_PLLMULL5 /*!< PLL input clock*5 */ +#define LL_RCC_PLL_MUL_6 RCC_CFGR_PLLMULL6 /*!< PLL input clock*6 */ +#define LL_RCC_PLL_MUL_7 RCC_CFGR_PLLMULL7 /*!< PLL input clock*7 */ +#define LL_RCC_PLL_MUL_8 RCC_CFGR_PLLMULL8 /*!< PLL input clock*8 */ +#define LL_RCC_PLL_MUL_9 RCC_CFGR_PLLMULL9 /*!< PLL input clock*9 */ +#if defined(RCC_CFGR_PLLMULL6_5) +#define LL_RCC_PLL_MUL_6_5 RCC_CFGR_PLLMULL6_5 /*!< PLL input clock*6 */ +#else +#define LL_RCC_PLL_MUL_10 RCC_CFGR_PLLMULL10 /*!< PLL input clock*10 */ +#define LL_RCC_PLL_MUL_11 RCC_CFGR_PLLMULL11 /*!< PLL input clock*11 */ +#define LL_RCC_PLL_MUL_12 RCC_CFGR_PLLMULL12 /*!< PLL input clock*12 */ +#define LL_RCC_PLL_MUL_13 RCC_CFGR_PLLMULL13 /*!< PLL input clock*13 */ +#define LL_RCC_PLL_MUL_14 RCC_CFGR_PLLMULL14 /*!< PLL input clock*14 */ +#define LL_RCC_PLL_MUL_15 RCC_CFGR_PLLMULL15 /*!< PLL input clock*15 */ +#define LL_RCC_PLL_MUL_16 RCC_CFGR_PLLMULL16 /*!< PLL input clock*16 */ +#endif /*RCC_CFGR_PLLMULL6_5*/ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLSOURCE PLL SOURCE + * @{ + */ +#define LL_RCC_PLLSOURCE_HSI_DIV_2 0x00000000U /*!< HSI clock divided by 2 selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE RCC_CFGR_PLLSRC /*!< HSE/PREDIV1 clock selected as PLL entry clock source */ +#if defined(RCC_CFGR2_PREDIV1SRC) +#define LL_RCC_PLLSOURCE_PLL2 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/PREDIV1 clock selected as PLL entry clock source */ +#endif /*RCC_CFGR2_PREDIV1SRC*/ + +#if defined(RCC_CFGR2_PREDIV1) +#define LL_RCC_PLLSOURCE_HSE_DIV_1 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV1) /*!< HSE/1 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_2 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV2) /*!< HSE/2 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_3 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV3) /*!< HSE/3 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_4 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV4) /*!< HSE/4 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_5 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV5) /*!< HSE/5 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_6 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV6) /*!< HSE/6 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_7 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV7) /*!< HSE/7 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_8 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV8) /*!< HSE/8 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_9 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV9) /*!< HSE/9 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_10 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV10) /*!< HSE/10 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_11 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV11) /*!< HSE/11 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_12 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV12) /*!< HSE/12 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_13 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV13) /*!< HSE/13 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_14 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV14) /*!< HSE/14 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_15 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV15) /*!< HSE/15 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_16 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV16) /*!< HSE/16 clock selected as PLL entry clock source */ +#if defined(RCC_CFGR2_PREDIV1SRC) +#define LL_RCC_PLLSOURCE_PLL2_DIV_1 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV1 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/1 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_2 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV2 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/2 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_3 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV3 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/3 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_4 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV4 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/4 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_5 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV5 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/5 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_6 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV6 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/6 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_7 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV7 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/7 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_8 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV8 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/8 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_9 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV9 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/9 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_10 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV10 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/10 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_11 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV11 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/11 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_12 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV12 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/12 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_13 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV13 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/13 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_14 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV14 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/14 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_15 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV15 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/15 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_PLL2_DIV_16 (RCC_CFGR_PLLSRC | RCC_CFGR2_PREDIV1_DIV16 | RCC_CFGR2_PREDIV1SRC << 4U) /*!< PLL2/16 clock selected as PLL entry clock source */ +#endif /*RCC_CFGR2_PREDIV1SRC*/ +#else +#define LL_RCC_PLLSOURCE_HSE_DIV_1 (RCC_CFGR_PLLSRC | 0x00000000U) /*!< HSE/1 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_2 (RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE) /*!< HSE/2 clock selected as PLL entry clock source */ +#endif /*RCC_CFGR2_PREDIV1*/ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PREDIV_DIV PREDIV Division factor + * @{ + */ +#if defined(RCC_CFGR2_PREDIV1) +#define LL_RCC_PREDIV_DIV_1 RCC_CFGR2_PREDIV1_DIV1 /*!< PREDIV1 input clock not divided */ +#define LL_RCC_PREDIV_DIV_2 RCC_CFGR2_PREDIV1_DIV2 /*!< PREDIV1 input clock divided by 2 */ +#define LL_RCC_PREDIV_DIV_3 RCC_CFGR2_PREDIV1_DIV3 /*!< PREDIV1 input clock divided by 3 */ +#define LL_RCC_PREDIV_DIV_4 RCC_CFGR2_PREDIV1_DIV4 /*!< PREDIV1 input clock divided by 4 */ +#define LL_RCC_PREDIV_DIV_5 RCC_CFGR2_PREDIV1_DIV5 /*!< PREDIV1 input clock divided by 5 */ +#define LL_RCC_PREDIV_DIV_6 RCC_CFGR2_PREDIV1_DIV6 /*!< PREDIV1 input clock divided by 6 */ +#define LL_RCC_PREDIV_DIV_7 RCC_CFGR2_PREDIV1_DIV7 /*!< PREDIV1 input clock divided by 7 */ +#define LL_RCC_PREDIV_DIV_8 RCC_CFGR2_PREDIV1_DIV8 /*!< PREDIV1 input clock divided by 8 */ +#define LL_RCC_PREDIV_DIV_9 RCC_CFGR2_PREDIV1_DIV9 /*!< PREDIV1 input clock divided by 9 */ +#define LL_RCC_PREDIV_DIV_10 RCC_CFGR2_PREDIV1_DIV10 /*!< PREDIV1 input clock divided by 10 */ +#define LL_RCC_PREDIV_DIV_11 RCC_CFGR2_PREDIV1_DIV11 /*!< PREDIV1 input clock divided by 11 */ +#define LL_RCC_PREDIV_DIV_12 RCC_CFGR2_PREDIV1_DIV12 /*!< PREDIV1 input clock divided by 12 */ +#define LL_RCC_PREDIV_DIV_13 RCC_CFGR2_PREDIV1_DIV13 /*!< PREDIV1 input clock divided by 13 */ +#define LL_RCC_PREDIV_DIV_14 RCC_CFGR2_PREDIV1_DIV14 /*!< PREDIV1 input clock divided by 14 */ +#define LL_RCC_PREDIV_DIV_15 RCC_CFGR2_PREDIV1_DIV15 /*!< PREDIV1 input clock divided by 15 */ +#define LL_RCC_PREDIV_DIV_16 RCC_CFGR2_PREDIV1_DIV16 /*!< PREDIV1 input clock divided by 16 */ +#else +#define LL_RCC_PREDIV_DIV_1 0x00000000U /*!< HSE divider clock clock not divided */ +#define LL_RCC_PREDIV_DIV_2 RCC_CFGR_PLLXTPRE /*!< HSE divider clock divided by 2 for PLL entry */ +#endif /*RCC_CFGR2_PREDIV1*/ +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EC_PLLI2S_MUL PLLI2S MUL + * @{ + */ +#define LL_RCC_PLLI2S_MUL_8 RCC_CFGR2_PLL3MUL8 /*!< PLLI2S input clock * 8 */ +#define LL_RCC_PLLI2S_MUL_9 RCC_CFGR2_PLL3MUL9 /*!< PLLI2S input clock * 9 */ +#define LL_RCC_PLLI2S_MUL_10 RCC_CFGR2_PLL3MUL10 /*!< PLLI2S input clock * 10 */ +#define LL_RCC_PLLI2S_MUL_11 RCC_CFGR2_PLL3MUL11 /*!< PLLI2S input clock * 11 */ +#define LL_RCC_PLLI2S_MUL_12 RCC_CFGR2_PLL3MUL12 /*!< PLLI2S input clock * 12 */ +#define LL_RCC_PLLI2S_MUL_13 RCC_CFGR2_PLL3MUL13 /*!< PLLI2S input clock * 13 */ +#define LL_RCC_PLLI2S_MUL_14 RCC_CFGR2_PLL3MUL14 /*!< PLLI2S input clock * 14 */ +#define LL_RCC_PLLI2S_MUL_16 RCC_CFGR2_PLL3MUL16 /*!< PLLI2S input clock * 16 */ +#define LL_RCC_PLLI2S_MUL_20 RCC_CFGR2_PLL3MUL20 /*!< PLLI2S input clock * 20 */ +/** + * @} + */ + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** @defgroup RCC_LL_EC_PLL2_MUL PLL2 MUL + * @{ + */ +#define LL_RCC_PLL2_MUL_8 RCC_CFGR2_PLL2MUL8 /*!< PLL2 input clock * 8 */ +#define LL_RCC_PLL2_MUL_9 RCC_CFGR2_PLL2MUL9 /*!< PLL2 input clock * 9 */ +#define LL_RCC_PLL2_MUL_10 RCC_CFGR2_PLL2MUL10 /*!< PLL2 input clock * 10 */ +#define LL_RCC_PLL2_MUL_11 RCC_CFGR2_PLL2MUL11 /*!< PLL2 input clock * 11 */ +#define LL_RCC_PLL2_MUL_12 RCC_CFGR2_PLL2MUL12 /*!< PLL2 input clock * 12 */ +#define LL_RCC_PLL2_MUL_13 RCC_CFGR2_PLL2MUL13 /*!< PLL2 input clock * 13 */ +#define LL_RCC_PLL2_MUL_14 RCC_CFGR2_PLL2MUL14 /*!< PLL2 input clock * 14 */ +#define LL_RCC_PLL2_MUL_16 RCC_CFGR2_PLL2MUL16 /*!< PLL2 input clock * 16 */ +#define LL_RCC_PLL2_MUL_20 RCC_CFGR2_PLL2MUL20 /*!< PLL2 input clock * 20 */ +/** + * @} + */ + +#endif /* RCC_PLL2_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 + * @{ + */ + +#if defined(RCC_CFGR_PLLMULL6_5) +/** + * @brief Helper macro to calculate the PLLCLK frequency + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE / (@ref LL_RCC_PLL_GetPrediv () + 1), @ref LL_RCC_PLL_GetMultiplicator()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE div Prediv1 / HSI div 2 / PLL2 div Prediv1) + * @param __PLLMUL__: This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_6_5 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLMUL__) \ + (((__PLLMUL__) != RCC_CFGR_PLLMULL6_5) ? \ + ((__INPUTFREQ__) * ((((__PLLMUL__) & RCC_CFGR_PLLMULL) >> RCC_CFGR_PLLMULL_Pos) + 2U)) :\ + (((__INPUTFREQ__) * 13U) / 2U)) + +#else +/** + * @brief Helper macro to calculate the PLLCLK frequency + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE / (@ref LL_RCC_PLL_GetPrediv () + 1), @ref LL_RCC_PLL_GetMultiplicator ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE div Prediv1 or div 2 / HSI div 2) + * @param __PLLMUL__: This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 + * @arg @ref LL_RCC_PLL_MUL_3 + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_10 + * @arg @ref LL_RCC_PLL_MUL_11 + * @arg @ref LL_RCC_PLL_MUL_12 + * @arg @ref LL_RCC_PLL_MUL_13 + * @arg @ref LL_RCC_PLL_MUL_14 + * @arg @ref LL_RCC_PLL_MUL_15 + * @arg @ref LL_RCC_PLL_MUL_16 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLMUL__) ((__INPUTFREQ__) * (((__PLLMUL__) >> RCC_CFGR_PLLMULL_Pos) + 2U)) +#endif /* RCC_CFGR_PLLMULL6_5 */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Helper macro to calculate the PLLI2S frequency + * @note ex: @ref __LL_RCC_CALC_PLLI2SCLK_FREQ (HSE_VALUE, @ref LL_RCC_PLLI2S_GetMultiplicator (), @ref LL_RCC_HSE_GetPrediv2 ()); + * @param __INPUTFREQ__ PLLI2S Input frequency (based on HSE value) + * @param __PLLI2SMUL__: This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2S_MUL_8 + * @arg @ref LL_RCC_PLLI2S_MUL_9 + * @arg @ref LL_RCC_PLLI2S_MUL_10 + * @arg @ref LL_RCC_PLLI2S_MUL_11 + * @arg @ref LL_RCC_PLLI2S_MUL_12 + * @arg @ref LL_RCC_PLLI2S_MUL_13 + * @arg @ref LL_RCC_PLLI2S_MUL_14 + * @arg @ref LL_RCC_PLLI2S_MUL_16 + * @arg @ref LL_RCC_PLLI2S_MUL_20 + * @param __PLLI2SDIV__: This parameter can be one of the following values: + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_1 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_2 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_3 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_4 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_5 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_6 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_7 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_8 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_9 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_10 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_11 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_12 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_13 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_14 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_15 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_16 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2SCLK_FREQ(__INPUTFREQ__, __PLLI2SMUL__, __PLLI2SDIV__) (((__INPUTFREQ__) * (((__PLLI2SMUL__) >> RCC_CFGR2_PLL3MUL_Pos) + 2U)) / (((__PLLI2SDIV__) >> RCC_CFGR2_PREDIV2_Pos) + 1U)) +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** + * @brief Helper macro to calculate the PLL2 frequency + * @note ex: @ref __LL_RCC_CALC_PLL2CLK_FREQ (HSE_VALUE, @ref LL_RCC_PLL2_GetMultiplicator (), @ref LL_RCC_HSE_GetPrediv2 ()); + * @param __INPUTFREQ__ PLL2 Input frequency (based on HSE value) + * @param __PLL2MUL__: This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL2_MUL_8 + * @arg @ref LL_RCC_PLL2_MUL_9 + * @arg @ref LL_RCC_PLL2_MUL_10 + * @arg @ref LL_RCC_PLL2_MUL_11 + * @arg @ref LL_RCC_PLL2_MUL_12 + * @arg @ref LL_RCC_PLL2_MUL_13 + * @arg @ref LL_RCC_PLL2_MUL_14 + * @arg @ref LL_RCC_PLL2_MUL_16 + * @arg @ref LL_RCC_PLL2_MUL_20 + * @param __PLL2DIV__: This parameter can be one of the following values: + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_1 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_2 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_3 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_4 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_5 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_6 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_7 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_8 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_9 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_10 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_11 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_12 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_13 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_14 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_15 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_16 + * @retval PLL2 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLL2CLK_FREQ(__INPUTFREQ__, __PLL2MUL__, __PLL2DIV__) (((__INPUTFREQ__) * (((__PLL2MUL__) >> RCC_CFGR2_PLL2MUL_Pos) + 2U)) / (((__PLL2DIV__) >> RCC_CFGR2_PREDIV2_Pos) + 1U)) +#endif /* RCC_PLL2_SUPPORT */ + +/** + * @brief Helper macro to calculate the HCLK frequency + * @note: __AHBPRESCALER__ be retrieved by @ref LL_RCC_GetAHBPrescaler + * ex: __LL_RCC_CALC_HCLK_FREQ(LL_RCC_GetAHBPrescaler()) + * @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) + * @note: __APB1PRESCALER__ be retrieved by @ref LL_RCC_GetAPB1Prescaler + * ex: __LL_RCC_CALC_PCLK1_FREQ(LL_RCC_GetAPB1Prescaler()) + * @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) + * @note: __APB2PRESCALER__ be retrieved by @ref LL_RCC_GetAPB2Prescaler + * ex: __LL_RCC_CALC_PCLK2_FREQ(LL_RCC_GetAPB2Prescaler()) + * @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)); +} + +#if defined(RCC_CFGR2_PREDIV2) +/** + * @brief Get PREDIV2 division factor + * @rmtoll CFGR2 PREDIV2 LL_RCC_HSE_GetPrediv2 + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_1 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_2 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_3 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_4 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_5 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_6 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_7 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_8 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_9 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_10 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_11 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_12 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_13 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_14 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_15 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_HSE_GetPrediv2(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV2)); +} +#endif /* RCC_CFGR2_PREDIV2 */ + +/** + * @} + */ + +/** @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 = 0x00 and Max_Data = 0x1F + * @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 = 0x00 and Max_Data = 0x1F + */ +__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)); +} + +/** + * @} + */ + +/** @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 + * @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 + */ +__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 + * @{ + */ + +/** + * @brief Configure MCOx + * @rmtoll CFGR MCO LL_RCC_ConfigMCO + * @param MCOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1SOURCE_NOCLOCK + * @arg @ref LL_RCC_MCO1SOURCE_SYSCLK + * @arg @ref LL_RCC_MCO1SOURCE_HSI + * @arg @ref LL_RCC_MCO1SOURCE_HSE + * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK_DIV_2 + * @arg @ref LL_RCC_MCO1SOURCE_PLL2CLK (*) + * @arg @ref LL_RCC_MCO1SOURCE_PLLI2SCLK_DIV2 (*) + * @arg @ref LL_RCC_MCO1SOURCE_EXT_HSE (*) + * @arg @ref LL_RCC_MCO1SOURCE_PLLI2SCLK (*) + * + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_MCOSEL, MCOxSource); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source + * @{ + */ + +#if defined(RCC_CFGR2_I2S2SRC) +/** + * @brief Configure I2Sx clock source + * @rmtoll CFGR2 I2S2SRC LL_RCC_SetI2SClockSource\n + * CFGR2 I2S3SRC LL_RCC_SetI2SClockSource + * @param I2SxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S2_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S_VCO + * @arg @ref LL_RCC_I2S3_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2S3_CLKSOURCE_PLLI2S_VCO + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t I2SxSource) +{ + MODIFY_REG(RCC->CFGR2, (I2SxSource & 0xFFFF0000U), (I2SxSource << 16U)); +} +#endif /* RCC_CFGR2_I2S2SRC */ + +#if defined(USB_OTG_FS) || defined(USB) +/** + * @brief Configure USB clock source + * @rmtoll CFGR OTGFSPRE LL_RCC_SetUSBClockSource\n + * CFGR USBPRE 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_PLL_DIV_1_5 (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL_DIV_2 (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL_DIV_3 (*) + * + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) +{ +#if defined(RCC_CFGR_USBPRE) + MODIFY_REG(RCC->CFGR, RCC_CFGR_USBPRE, USBxSource); +#else /*RCC_CFGR_OTGFSPRE*/ + MODIFY_REG(RCC->CFGR, RCC_CFGR_OTGFSPRE, USBxSource); +#endif /*RCC_CFGR_USBPRE*/ +} +#endif /* USB_OTG_FS || USB */ + +/** + * @brief Configure ADC clock source + * @rmtoll CFGR ADCPRE LL_RCC_SetADCClockSource + * @param ADCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_2 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_4 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_6 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetADCClockSource(uint32_t ADCxSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_ADCPRE, ADCxSource); +} + +#if defined(RCC_CFGR2_I2S2SRC) +/** + * @brief Get I2Sx clock source + * @rmtoll CFGR2 I2S2SRC LL_RCC_GetI2SClockSource\n + * CFGR2 I2S3SRC LL_RCC_GetI2SClockSource + * @param I2Sx This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S2_CLKSOURCE + * @arg @ref LL_RCC_I2S3_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_I2S2_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S_VCO + * @arg @ref LL_RCC_I2S3_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2S3_CLKSOURCE_PLLI2S_VCO + */ +__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR2, I2Sx) >> 16U | I2Sx); +} +#endif /* RCC_CFGR2_I2S2SRC */ + +#if defined(USB_OTG_FS) || defined(USB) +/** + * @brief Get USBx clock source + * @rmtoll CFGR OTGFSPRE LL_RCC_GetUSBClockSource\n + * CFGR USBPRE 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_PLL_DIV_1_5 (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL_DIV_2 (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL_DIV_3 (*) + * + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, USBx)); +} +#endif /* USB_OTG_FS || USB */ + +/** + * @brief Get ADCx clock source + * @rmtoll CFGR ADCPRE LL_RCC_GetADCClockSource + * @param ADCx This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_2 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_4 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_6 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_GetADCClockSource(uint32_t ADCx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, ADCx)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_RTC RTC + * @{ + */ + +/** + * @brief Set RTC Clock Source + * @note Once the RTC clock source has been selected, it cannot be changed any more unless + * the Backup domain is reset. 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_DIV128 + * @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_DIV128 + */ +__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); +} + +/** + * @} + */ + +/** @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 + * @rmtoll CFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR PLLXTPRE LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR PLLMULL LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR2 PREDIV1 LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR2 PREDIV1SRC LL_RCC_PLL_ConfigDomain_SYS + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI_DIV_2 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_1 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_2 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_3 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_4 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_5 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_6 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_7 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_8 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_9 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_10 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_11 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_12 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_13 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_14 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_15 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_16 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_1 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_2 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_3 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_4 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_5 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_6 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_7 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_8 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_9 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_10 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_11 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_12 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_13 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_14 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_15 (*) + * @arg @ref LL_RCC_PLLSOURCE_PLL2_DIV_16 (*) + * + * (*) value not defined in all devices + * @param PLLMul This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 (*) + * @arg @ref LL_RCC_PLL_MUL_3 (*) + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_6_5 (*) + * @arg @ref LL_RCC_PLL_MUL_10 (*) + * @arg @ref LL_RCC_PLL_MUL_11 (*) + * @arg @ref LL_RCC_PLL_MUL_12 (*) + * @arg @ref LL_RCC_PLL_MUL_13 (*) + * @arg @ref LL_RCC_PLL_MUL_14 (*) + * @arg @ref LL_RCC_PLL_MUL_15 (*) + * @arg @ref LL_RCC_PLL_MUL_16 (*) + * + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLMul) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL, + (Source & (RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE)) | PLLMul); +#if defined(RCC_CFGR2_PREDIV1) +#if defined(RCC_CFGR2_PREDIV1SRC) + MODIFY_REG(RCC->CFGR2, (RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC), + (Source & RCC_CFGR2_PREDIV1) | ((Source & (RCC_CFGR2_PREDIV1SRC << 4U)) >> 4U)); +#else + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV1, (Source & RCC_CFGR2_PREDIV1)); +#endif /*RCC_CFGR2_PREDIV1SRC*/ +#endif /*RCC_CFGR2_PREDIV1*/ +} + +/** + * @brief Configure PLL clock source + * @rmtoll CFGR PLLSRC LL_RCC_PLL_SetMainSource\n + * CFGR2 PREDIV1SRC LL_RCC_PLL_SetMainSource + * @param PLLSource This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI_DIV_2 + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLSOURCE_PLL2 (*) + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) +{ +#if defined(RCC_CFGR2_PREDIV1SRC) + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC, ((PLLSource & (RCC_CFGR2_PREDIV1SRC << 4U)) >> 4U)); +#endif /* RCC_CFGR2_PREDIV1SRC */ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC, PLLSource); +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll CFGR PLLSRC LL_RCC_PLL_GetMainSource\n + * CFGR2 PREDIV1SRC LL_RCC_PLL_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI_DIV_2 + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLSOURCE_PLL2 (*) + * + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) +{ +#if defined(RCC_CFGR2_PREDIV1SRC) + uint32_t pllsrc = READ_BIT(RCC->CFGR, RCC_CFGR_PLLSRC); + uint32_t predivsrc = (uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC) << 4U); + return (uint32_t)(pllsrc | predivsrc); +#else + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLSRC)); +#endif /*RCC_CFGR2_PREDIV1SRC*/ +} + +/** + * @brief Get PLL multiplication Factor + * @rmtoll CFGR PLLMULL LL_RCC_PLL_GetMultiplicator + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 (*) + * @arg @ref LL_RCC_PLL_MUL_3 (*) + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_6_5 (*) + * @arg @ref LL_RCC_PLL_MUL_10 (*) + * @arg @ref LL_RCC_PLL_MUL_11 (*) + * @arg @ref LL_RCC_PLL_MUL_12 (*) + * @arg @ref LL_RCC_PLL_MUL_13 (*) + * @arg @ref LL_RCC_PLL_MUL_14 (*) + * @arg @ref LL_RCC_PLL_MUL_15 (*) + * @arg @ref LL_RCC_PLL_MUL_16 (*) + * + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMultiplicator(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLMULL)); +} + +/** + * @brief Get PREDIV1 division factor for the main PLL + * @note They can be written only when the PLL is disabled + * @rmtoll CFGR2 PREDIV1 LL_RCC_PLL_GetPrediv\n + * CFGR2 PLLXTPRE LL_RCC_PLL_GetPrediv + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PREDIV_DIV_1 + * @arg @ref LL_RCC_PREDIV_DIV_2 + * @arg @ref LL_RCC_PREDIV_DIV_3 (*) + * @arg @ref LL_RCC_PREDIV_DIV_4 (*) + * @arg @ref LL_RCC_PREDIV_DIV_5 (*) + * @arg @ref LL_RCC_PREDIV_DIV_6 (*) + * @arg @ref LL_RCC_PREDIV_DIV_7 (*) + * @arg @ref LL_RCC_PREDIV_DIV_8 (*) + * @arg @ref LL_RCC_PREDIV_DIV_9 (*) + * @arg @ref LL_RCC_PREDIV_DIV_10 (*) + * @arg @ref LL_RCC_PREDIV_DIV_11 (*) + * @arg @ref LL_RCC_PREDIV_DIV_12 (*) + * @arg @ref LL_RCC_PREDIV_DIV_13 (*) + * @arg @ref LL_RCC_PREDIV_DIV_14 (*) + * @arg @ref LL_RCC_PREDIV_DIV_15 (*) + * @arg @ref LL_RCC_PREDIV_DIV_16 (*) + * + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetPrediv(void) +{ +#if defined(RCC_CFGR2_PREDIV1) + return (uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1)); +#else + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLXTPRE) >> RCC_CFGR_PLLXTPRE_Pos); +#endif /*RCC_CFGR2_PREDIV1*/ +} + +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EF_PLLI2S PLLI2S + * @{ + */ + +/** + * @brief Enable PLLI2S + * @rmtoll CR PLL3ON LL_RCC_PLLI2S_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLL3ON); +} + +/** + * @brief Disable PLLI2S + * @rmtoll CR PLL3ON LL_RCC_PLLI2S_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLL3ON); +} + +/** + * @brief Check if PLLI2S Ready + * @rmtoll CR PLL3RDY 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_PLL3RDY) == (RCC_CR_PLL3RDY)); +} + +/** + * @brief Configure PLLI2S used for I2S Domain + * @rmtoll CFGR2 PREDIV2 LL_RCC_PLL_ConfigDomain_PLLI2S\n + * CFGR2 PLL3MUL LL_RCC_PLL_ConfigDomain_PLLI2S + * @param Divider This parameter can be one of the following values: + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_1 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_2 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_3 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_4 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_5 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_6 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_7 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_8 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_9 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_10 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_11 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_12 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_13 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_14 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_15 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_16 + * @param Multiplicator This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2S_MUL_8 + * @arg @ref LL_RCC_PLLI2S_MUL_9 + * @arg @ref LL_RCC_PLLI2S_MUL_10 + * @arg @ref LL_RCC_PLLI2S_MUL_11 + * @arg @ref LL_RCC_PLLI2S_MUL_12 + * @arg @ref LL_RCC_PLLI2S_MUL_13 + * @arg @ref LL_RCC_PLLI2S_MUL_14 + * @arg @ref LL_RCC_PLLI2S_MUL_16 + * @arg @ref LL_RCC_PLLI2S_MUL_20 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_PLLI2S(uint32_t Divider, uint32_t Multiplicator) +{ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL3MUL, Divider | Multiplicator); +} + +/** + * @brief Get PLLI2S Multiplication Factor + * @rmtoll CFGR2 PLL3MUL LL_RCC_PLLI2S_GetMultiplicator + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2S_MUL_8 + * @arg @ref LL_RCC_PLLI2S_MUL_9 + * @arg @ref LL_RCC_PLLI2S_MUL_10 + * @arg @ref LL_RCC_PLLI2S_MUL_11 + * @arg @ref LL_RCC_PLLI2S_MUL_12 + * @arg @ref LL_RCC_PLLI2S_MUL_13 + * @arg @ref LL_RCC_PLLI2S_MUL_14 + * @arg @ref LL_RCC_PLLI2S_MUL_16 + * @arg @ref LL_RCC_PLLI2S_MUL_20 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMultiplicator(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_PLL3MUL)); +} + +/** + * @} + */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** @defgroup RCC_LL_EF_PLL2 PLL2 + * @{ + */ + +/** + * @brief Enable PLL2 + * @rmtoll CR PLL2ON LL_RCC_PLL2_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL2_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLL2ON); +} + +/** + * @brief Disable PLL2 + * @rmtoll CR PLL2ON LL_RCC_PLL2_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL2_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLL2ON); +} + +/** + * @brief Check if PLL2 Ready + * @rmtoll CR PLL2RDY LL_RCC_PLL2_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLL2_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLL2RDY) == (RCC_CR_PLL2RDY)); +} + +/** + * @brief Configure PLL2 used for PLL2 Domain + * @rmtoll CFGR2 PREDIV2 LL_RCC_PLL_ConfigDomain_PLL2\n + * CFGR2 PLL2MUL LL_RCC_PLL_ConfigDomain_PLL2 + * @param Divider This parameter can be one of the following values: + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_1 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_2 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_3 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_4 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_5 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_6 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_7 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_8 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_9 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_10 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_11 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_12 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_13 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_14 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_15 + * @arg @ref LL_RCC_HSE_PREDIV2_DIV_16 + * @param Multiplicator This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL2_MUL_8 + * @arg @ref LL_RCC_PLL2_MUL_9 + * @arg @ref LL_RCC_PLL2_MUL_10 + * @arg @ref LL_RCC_PLL2_MUL_11 + * @arg @ref LL_RCC_PLL2_MUL_12 + * @arg @ref LL_RCC_PLL2_MUL_13 + * @arg @ref LL_RCC_PLL2_MUL_14 + * @arg @ref LL_RCC_PLL2_MUL_16 + * @arg @ref LL_RCC_PLL2_MUL_20 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_PLL2(uint32_t Divider, uint32_t Multiplicator) +{ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL, Divider | Multiplicator); +} + +/** + * @brief Get PLL2 Multiplication Factor + * @rmtoll CFGR2 PLL2MUL LL_RCC_PLL2_GetMultiplicator + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLL2_MUL_8 + * @arg @ref LL_RCC_PLL2_MUL_9 + * @arg @ref LL_RCC_PLL2_MUL_10 + * @arg @ref LL_RCC_PLL2_MUL_11 + * @arg @ref LL_RCC_PLL2_MUL_12 + * @arg @ref LL_RCC_PLL2_MUL_13 + * @arg @ref LL_RCC_PLL2_MUL_14 + * @arg @ref LL_RCC_PLL2_MUL_16 + * @arg @ref LL_RCC_PLL2_MUL_20 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL2_GetMultiplicator(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_PLL2MUL)); +} + +/** + * @} + */ +#endif /* RCC_PLL2_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 PLL3RDYC LL_RCC_ClearFlag_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLL3RDYC); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** + * @brief Clear PLL2 ready interrupt flag + * @rmtoll CIR PLL2RDYC LL_RCC_ClearFlag_PLL2RDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLL2RDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLL2RDYC); +} +#endif /* RCC_PLL2_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 PLL3RDYF 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_PLL3RDYF) == (RCC_CIR_PLL3RDYF)); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** + * @brief Check if PLL2 ready interrupt occurred or not + * @rmtoll CIR PLL2RDYF LL_RCC_IsActiveFlag_PLL2RDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLL2RDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLL2RDYF) == (RCC_CIR_PLL2RDYF)); +} +#endif /* RCC_PLL2_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)); +} + +/** + * @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 PLL3RDYIE LL_RCC_EnableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLL3RDYIE); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** + * @brief Enable PLL2 ready interrupt + * @rmtoll CIR PLL2RDYIE LL_RCC_EnableIT_PLL2RDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLL2RDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLL2RDYIE); +} +#endif /* RCC_PLL2_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 PLL3RDYIE LL_RCC_DisableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLL3RDYIE); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** + * @brief Disable PLL2 ready interrupt + * @rmtoll CIR PLL2RDYIE LL_RCC_DisableIT_PLL2RDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLL2RDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLL2RDYIE); +} +#endif /* RCC_PLL2_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 PLL3RDYIE 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_PLL3RDYIE) == (RCC_CIR_PLL3RDYIE)); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLL2_SUPPORT) +/** + * @brief Checks if PLL2 ready interrupt source is enabled or disabled. + * @rmtoll CIR PLL2RDYIE LL_RCC_IsEnabledIT_PLL2RDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLL2RDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLL2RDYIE) == (RCC_CIR_PLL2RDYIE)); +} +#endif /* RCC_PLL2_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(RCC_CFGR2_I2S2SRC) +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); +#endif /* RCC_CFGR2_I2S2SRC */ +#if defined(USB_OTG_FS) || defined(USB) +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); +#endif /* USB_OTG_FS || USB */ +uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* RCC */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_LL_RCC_H */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_system.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_system.h new file mode 100644 index 0000000..0aba37b --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_system.h @@ -0,0 +1,575 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_system.h + * @author MCD Application Team + * @brief Header file of SYSTEM 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. + * + ****************************************************************************** + @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 __STM32F1xx_LL_SYSTEM_H +#define __STM32F1xx_LL_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_LL_Driver + * @{ + */ + +#if defined (FLASH) || 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_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 + * @{ + */ +#define LL_DBGMCU_APB1_GRP1_TIM2_STOP DBGMCU_CR_DBG_TIM2_STOP /*!< TIM2 counter stopped when core is halted */ +#define LL_DBGMCU_APB1_GRP1_TIM3_STOP DBGMCU_CR_DBG_TIM3_STOP /*!< TIM3 counter stopped when core is halted */ +#define LL_DBGMCU_APB1_GRP1_TIM4_STOP DBGMCU_CR_DBG_TIM4_STOP /*!< TIM4 counter stopped when core is halted */ +#if defined(DBGMCU_CR_DBG_TIM5_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM5_STOP DBGMCU_CR_DBG_TIM5_STOP /*!< TIM5 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM5_STOP */ +#if defined(DBGMCU_CR_DBG_TIM6_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM6_STOP DBGMCU_CR_DBG_TIM6_STOP /*!< TIM6 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM6_STOP */ +#if defined(DBGMCU_CR_DBG_TIM7_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM7_STOP DBGMCU_CR_DBG_TIM7_STOP /*!< TIM7 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM7_STOP */ +#if defined(DBGMCU_CR_DBG_TIM12_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM12_STOP DBGMCU_CR_DBG_TIM12_STOP /*!< TIM12 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM12_STOP */ +#if defined(DBGMCU_CR_DBG_TIM13_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM13_STOP DBGMCU_CR_DBG_TIM13_STOP /*!< TIM13 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM13_STOP */ +#if defined(DBGMCU_CR_DBG_TIM14_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM14_STOP DBGMCU_CR_DBG_TIM14_STOP /*!< TIM14 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM14_STOP */ +#define LL_DBGMCU_APB1_GRP1_WWDG_STOP DBGMCU_CR_DBG_WWDG_STOP /*!< Debug Window Watchdog stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_IWDG_STOP DBGMCU_CR_DBG_IWDG_STOP /*!< Debug Independent Watchdog stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_I2C1_STOP DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ +#if defined(DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT) +#define LL_DBGMCU_APB1_GRP1_I2C2_STOP DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT /*!< I2C2 SMBUS timeout mode stopped when Core is halted */ +#endif /* DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT */ +#if defined(DBGMCU_CR_DBG_CAN1_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN1_STOP DBGMCU_CR_DBG_CAN1_STOP /*!< CAN1 debug stopped when Core is halted */ +#endif /* DBGMCU_CR_DBG_CAN1_STOP */ +#if defined(DBGMCU_CR_DBG_CAN2_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN2_STOP DBGMCU_CR_DBG_CAN2_STOP /*!< CAN2 debug stopped when Core is halted */ +#endif /* DBGMCU_CR_DBG_CAN2_STOP */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_APB2_GRP1_STOP_IP DBGMCU APB2 GRP1 STOP IP + * @{ + */ +#define LL_DBGMCU_APB2_GRP1_TIM1_STOP DBGMCU_CR_DBG_TIM1_STOP /*!< TIM1 counter stopped when core is halted */ +#if defined(DBGMCU_CR_DBG_TIM8_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM8_STOP DBGMCU_CR_DBG_TIM8_STOP /*!< TIM8 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_CAN1_STOP */ +#if defined(DBGMCU_CR_DBG_TIM9_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM9_STOP DBGMCU_CR_DBG_TIM9_STOP /*!< TIM9 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM9_STOP */ +#if defined(DBGMCU_CR_DBG_TIM10_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM10_STOP DBGMCU_CR_DBG_TIM10_STOP /*!< TIM10 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM10_STOP */ +#if defined(DBGMCU_CR_DBG_TIM11_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM11_STOP DBGMCU_CR_DBG_TIM11_STOP /*!< TIM11 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM11_STOP */ +#if defined(DBGMCU_CR_DBG_TIM15_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM15_STOP DBGMCU_CR_DBG_TIM15_STOP /*!< TIM15 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM15_STOP */ +#if defined(DBGMCU_CR_DBG_TIM16_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM16_STOP DBGMCU_CR_DBG_TIM16_STOP /*!< TIM16 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM16_STOP */ +#if defined(DBGMCU_CR_DBG_TIM17_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM17_STOP DBGMCU_CR_DBG_TIM17_STOP /*!< TIM17 counter stopped when core is halted */ +#endif /* DBGMCU_CR_DBG_TIM17_STOP */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_LATENCY FLASH LATENCY + * @{ + */ +#if defined(FLASH_ACR_LATENCY) +#define LL_FLASH_LATENCY_0 0x00000000U /*!< FLASH Zero Latency cycle */ +#define LL_FLASH_LATENCY_1 FLASH_ACR_LATENCY_0 /*!< FLASH One Latency cycle */ +#define LL_FLASH_LATENCY_2 FLASH_ACR_LATENCY_1 /*!< FLASH Two wait states */ +#else +#endif /* FLASH_ACR_LATENCY */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Exported_Functions SYSTEM Exported Functions + * @{ + */ + + + +/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU + * @{ + */ + +/** + * @brief Return the device identifier + * @note For Low Density devices, the device ID is 0x412 + * @note For Medium Density devices, the device ID is 0x410 + * @note For High Density devices, the device ID is 0x414 + * @note For XL Density devices, the device ID is 0x430 + * @note For Connectivity Line devices, the device ID is 0x418 + * @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,for Low Density devices + For example, it is read as revA -> 0x0000, revB -> 0x2000, revZ -> 0x2001, rev1,2,3,X or Y -> 0x2003,for Medium Density devices + For example, it is read as revA or 1 -> 0x1000, revZ -> 0x1001,rev1,2,3,X or Y -> 0x1003,for Medium Density devices + For example, it is read as revA or 1 -> 0x1003,for XL Density devices + For example, it is read as revA -> 0x1000, revZ -> 0x1001 for Connectivity line 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_CR_APB1 DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_CR_APB1 DBG_CAN2_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_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_CAN1_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_FreezePeriph(uint32_t Periphs) +{ + SET_BIT(DBGMCU->CR, Periphs); +} + +/** + * @brief Unfreeze APB1 peripherals (group1 peripherals) + * @rmtoll DBGMCU_CR_APB1 DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_CR_APB1 DBG_CAN2_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_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_CAN1_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_UnFreezePeriph(uint32_t Periphs) +{ + CLEAR_BIT(DBGMCU->CR, Periphs); +} + +/** + * @brief Freeze APB2 peripherals + * @rmtoll DBGMCU_CR_APB2 DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM15_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM16_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM17_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 (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM15_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM16_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM17_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_FreezePeriph(uint32_t Periphs) +{ + SET_BIT(DBGMCU->CR, Periphs); +} + +/** + * @brief Unfreeze APB2 peripherals + * @rmtoll DBGMCU_CR_APB2 DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM15_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM16_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_CR_APB2 DBG_TIM17_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 (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM15_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM16_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM17_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_UnFreezePeriph(uint32_t Periphs) +{ + CLEAR_BIT(DBGMCU->CR, Periphs); +} +/** + * @} + */ + +#if defined(FLASH_ACR_LATENCY) +/** @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 + * @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 + */ +__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) +{ + return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); +} + +/** + * @brief Enable Prefetch + * @rmtoll FLASH_ACR PRFTBE LL_FLASH_EnablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); +} + +/** + * @brief Disable Prefetch + * @rmtoll FLASH_ACR PRFTBE LL_FLASH_DisablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); +} + +/** + * @brief Check if Prefetch buffer is enabled + * @rmtoll FLASH_ACR PRFTBS 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_PRFTBS) == (FLASH_ACR_PRFTBS)); +} + +#endif /* FLASH_ACR_LATENCY */ +/** + * @brief Enable Flash Half Cycle Access + * @rmtoll FLASH_ACR HLFCYA LL_FLASH_EnableHalfCycleAccess + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableHalfCycleAccess(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_HLFCYA); +} + +/** + * @brief Disable Flash Half Cycle Access + * @rmtoll FLASH_ACR HLFCYA LL_FLASH_DisableHalfCycleAccess + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableHalfCycleAccess(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_HLFCYA); +} + +/** + * @brief Check if Flash Half Cycle Access is enabled or not + * @rmtoll FLASH_ACR HLFCYA LL_FLASH_IsHalfCycleAccessEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_FLASH_IsHalfCycleAccessEnabled(void) +{ + return (READ_BIT(FLASH->ACR, FLASH_ACR_HLFCYA) == (FLASH_ACR_HLFCYA)); +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (FLASH) || defined (DBGMCU) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_LL_SYSTEM_H */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h new file mode 100644 index 0000000..f0e13e8 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h @@ -0,0 +1,641 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_usb.h + * @author MCD Application Team + * @brief Header file of USB Low Layer 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 STM32F1xx_LL_USB_H +#define STM32F1xx_LL_USB_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal_def.h" + +#if defined (USB) || defined (USB_OTG_FS) +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @addtogroup USB_LL + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +#ifndef HAL_USB_TIMEOUT +#define HAL_USB_TIMEOUT 0xF000000U +#endif /* define HAL_USB_TIMEOUT */ + +#ifndef HAL_USB_CURRENT_MODE_MAX_DELAY_MS +#define HAL_USB_CURRENT_MODE_MAX_DELAY_MS 200U +#endif /* define HAL_USB_CURRENT_MODE_MAX_DELAY_MS */ + +/** + * @brief USB Mode definition + */ + +typedef enum +{ + USB_DEVICE_MODE = 0, + USB_HOST_MODE = 1, + USB_DRD_MODE = 2 +} USB_ModeTypeDef; + +/** + * @brief URB States definition + */ +typedef enum +{ + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_NYET, + URB_ERROR, + URB_STALL +} USB_URBStateTypeDef; + +/** + * @brief Host channel States definition + */ +typedef enum +{ + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_ACK, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR +} USB_HCStateTypeDef; + + +/** + * @brief USB Instance Initialization Structure definition + */ +typedef struct +{ + uint8_t dev_endpoints; /*!< Device Endpoints number. + This parameter depends on the used USB core. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + +#if defined (USB_OTG_FS) + uint8_t Host_channels; /*!< Host Channels number. + This parameter Depends on the used USB core. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ +#endif /* defined (USB_OTG_FS) */ + + uint8_t dma_enable; /*!< USB DMA state. + If DMA is not supported this parameter shall be set by default to zero */ + + uint8_t speed; /*!< USB Core speed. + This parameter can be any value of @ref PCD_Speed/HCD_Speed + (HCD_SPEED_xxx, HCD_SPEED_xxx) */ + + uint8_t ep0_mps; /*!< Set the Endpoint 0 Max Packet size. */ + + uint8_t phy_itface; /*!< Select the used PHY interface. + This parameter can be any value of @ref PCD_PHY_Module/HCD_PHY_Module */ + + uint8_t Sof_enable; /*!< Enable or disable the output of the SOF signal. */ + + uint8_t low_power_enable; /*!< Enable or disable the low Power Mode. */ + + uint8_t lpm_enable; /*!< Enable or disable Link Power Management. */ + + uint8_t battery_charging_enable; /*!< Enable or disable Battery charging. */ + +#if defined (USB_OTG_FS) + uint8_t vbus_sensing_enable; /*!< Enable or disable the VBUS Sensing feature. */ + + uint8_t use_dedicated_ep1; /*!< Enable or disable the use of the dedicated EP1 interrupt. */ + + uint8_t use_external_vbus; /*!< Enable or disable the use of the external VBUS. */ +#endif /* defined (USB_OTG_FS) */ +} USB_CfgTypeDef; + +typedef struct +{ + uint8_t num; /*!< Endpoint number + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint8_t is_in; /*!< Endpoint direction + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t is_stall; /*!< Endpoint stall condition + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + +#if defined (USB_OTG_FS) + uint8_t is_iso_incomplete; /*!< Endpoint isoc condition + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ +#endif /* defined (USB_OTG_FS) */ + + uint8_t type; /*!< Endpoint type + This parameter can be any value of @ref USB_LL_EP_Type */ + + uint8_t data_pid_start; /*!< Initial data PID + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + +#if defined (USB) + uint16_t pmaadress; /*!< PMA Address + This parameter can be any value between Min_addr = 0 and Max_addr = 1K */ + + uint16_t pmaaddr0; /*!< PMA Address0 + This parameter can be any value between Min_addr = 0 and Max_addr = 1K */ + + uint16_t pmaaddr1; /*!< PMA Address1 + This parameter can be any value between Min_addr = 0 and Max_addr = 1K */ + + uint8_t doublebuffer; /*!< Double buffer enable + This parameter can be 0 or 1 */ +#endif /* defined (USB) */ + + uint32_t maxpacket; /*!< Endpoint Max packet size + This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ + + uint8_t *xfer_buff; /*!< Pointer to transfer buffer */ + + uint32_t xfer_len; /*!< Current transfer length */ + + uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */ + +#if defined (USB_OTG_FS) + uint8_t even_odd_frame; /*!< IFrame parity + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint16_t tx_fifo_num; /*!< Transmission FIFO number + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address */ + + uint32_t xfer_size; /*!< requested transfer size */ +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) + uint32_t xfer_len_db; /*!< double buffer transfer length used with bulk double buffer in */ + + uint8_t xfer_fill_db; /*!< double buffer Need to Fill new buffer used with bulk_in */ +#endif /* defined (USB) */ +} USB_EPTypeDef; + +typedef struct +{ + uint8_t dev_addr; /*!< USB device address. + This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ + + uint8_t ch_num; /*!< Host channel number. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint8_t ep_num; /*!< Endpoint number. + This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ + + uint8_t ep_is_in; /*!< Endpoint direction + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t speed; /*!< USB Host Channel speed. + This parameter can be any value of @ref HCD_Device_Speed: + (HCD_DEVICE_SPEED_xxx) */ + + uint8_t do_ping; /*!< Enable or disable the use of the PING protocol for HS mode. */ + + uint8_t hub_port_nbr; /*!< USB HUB port number */ + uint8_t hub_addr; /*!< USB HUB address */ + + uint8_t ep_type; /*!< Endpoint Type. + This parameter can be any value of @ref USB_LL_EP_Type */ + + uint16_t max_packet; /*!< Endpoint Max packet size. + This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ + + uint8_t data_pid; /*!< Initial data PID. + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t *xfer_buff; /*!< Pointer to transfer buffer. */ + + uint32_t XferSize; /*!< OTG Channel transfer size. */ + + uint32_t xfer_len; /*!< Current transfer length. */ + + uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer. */ + + uint8_t toggle_in; /*!< IN transfer current toggle flag. + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint8_t toggle_out; /*!< OUT transfer current toggle flag + This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ + + uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address. */ + + uint32_t ErrCnt; /*!< Host channel error count. */ + + USB_URBStateTypeDef urb_state; /*!< URB state. + This parameter can be any value of @ref USB_URBStateTypeDef */ + + USB_HCStateTypeDef state; /*!< Host Channel state. + This parameter can be any value of @ref USB_HCStateTypeDef */ +} USB_HCTypeDef; + +#if defined (USB_OTG_FS) +typedef USB_ModeTypeDef USB_OTG_ModeTypeDef; +typedef USB_CfgTypeDef USB_OTG_CfgTypeDef; +typedef USB_EPTypeDef USB_OTG_EPTypeDef; +typedef USB_URBStateTypeDef USB_OTG_URBStateTypeDef; +typedef USB_HCStateTypeDef USB_OTG_HCStateTypeDef; +typedef USB_HCTypeDef USB_OTG_HCTypeDef; +#endif /* defined (USB_OTG_FS) */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup PCD_Exported_Constants PCD Exported Constants + * @{ + */ + +#if defined (USB_OTG_FS) +/** @defgroup USB_OTG_CORE VERSION ID + * @{ + */ +#define USB_OTG_CORE_ID_300A 0x4F54300AU +#define USB_OTG_CORE_ID_310A 0x4F54310AU +/** + * @} + */ + +/** @defgroup USB_Core_Mode_ USB Core Mode + * @{ + */ +#define USB_OTG_MODE_DEVICE 0U +#define USB_OTG_MODE_HOST 1U +#define USB_OTG_MODE_DRD 2U +/** + * @} + */ + +/** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed + * @{ + */ +#define USB_OTG_SPEED_FULL 3U +/** + * @} + */ + +/** @defgroup USB_LL_Core_PHY USB Low Layer Core PHY + * @{ + */ +#define USB_OTG_EMBEDDED_PHY 2U +/** + * @} + */ + +/** @defgroup USB_LL_Turnaround_Timeout Turnaround Timeout Value + * @{ + */ +#ifndef USBD_FS_TRDT_VALUE +#define USBD_FS_TRDT_VALUE 5U +#define USBD_DEFAULT_TRDT_VALUE 9U +#endif /* USBD_HS_TRDT_VALUE */ +/** + * @} + */ + +/** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS + * @{ + */ +#define USB_OTG_FS_MAX_PACKET_SIZE 64U +#define USB_OTG_MAX_EP0_SIZE 64U +/** + * @} + */ + +/** @defgroup USB_LL_Core_PHY_Frequency USB Low Layer Core PHY Frequency + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) +#define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) +/** + * @} + */ + +/** @defgroup USB_LL_CORE_Frame_Interval USB Low Layer Core Frame Interval + * @{ + */ +#define DCFG_FRAME_INTERVAL_80 0U +#define DCFG_FRAME_INTERVAL_85 1U +#define DCFG_FRAME_INTERVAL_90 2U +#define DCFG_FRAME_INTERVAL_95 3U +/** + * @} + */ +#endif /* defined (USB_OTG_FS) */ +/** @defgroup USB_LL_EP0_MPS USB Low Layer EP0 MPS + * @{ + */ +#define EP_MPS_64 0U +#define EP_MPS_32 1U +#define EP_MPS_16 2U +#define EP_MPS_8 3U +/** + * @} + */ + +/** @defgroup USB_LL_EP_Type USB Low Layer EP Type + * @{ + */ +#define EP_TYPE_CTRL 0U +#define EP_TYPE_ISOC 1U +#define EP_TYPE_BULK 2U +#define EP_TYPE_INTR 3U +#define EP_TYPE_MSK 3U +/** + * @} + */ + +/** @defgroup USB_LL_EP_Speed USB Low Layer EP Speed + * @{ + */ +#define EP_SPEED_LOW 0U +#define EP_SPEED_FULL 1U +#define EP_SPEED_HIGH 2U +/** + * @} + */ + +/** @defgroup USB_LL_CH_PID_Type USB Low Layer Channel PID Type + * @{ + */ +#define HC_PID_DATA0 0U +#define HC_PID_DATA2 1U +#define HC_PID_DATA1 2U +#define HC_PID_SETUP 3U +/** + * @} + */ + +/** @defgroup USB_LL Device Speed + * @{ + */ +#define USBD_FS_SPEED 2U +#define USBH_FSLS_SPEED 1U +/** + * @} + */ + +#if defined (USB_OTG_FS) +/** @defgroup USB_LL_STS_Defines USB Low Layer STS Defines + * @{ + */ +#define STS_GOUT_NAK 1U +#define STS_DATA_UPDT 2U +#define STS_XFER_COMP 3U +#define STS_SETUP_COMP 4U +#define STS_SETUP_UPDT 6U +/** + * @} + */ + +/** @defgroup USB_LL_HCFG_SPEED_Defines USB Low Layer HCFG Speed Defines + * @{ + */ +#define HCFG_30_60_MHZ 0U +#define HCFG_48_MHZ 1U +#define HCFG_6_MHZ 2U +/** + * @} + */ + +/** @defgroup USB_LL_HFIR_Defines USB Low Layer frame interval Defines + * @{ + */ +#define HFIR_6_MHZ 6000U +#define HFIR_60_MHZ 60000U +#define HFIR_48_MHZ 48000U +/** + * @} + */ + +/** @defgroup USB_LL_HPRT0_PRTSPD_SPEED_Defines USB Low Layer HPRT0 PRTSPD Speed Defines + * @{ + */ +#define HPRT0_PRTSPD_HIGH_SPEED 0U +#define HPRT0_PRTSPD_FULL_SPEED 1U +#define HPRT0_PRTSPD_LOW_SPEED 2U +/** + * @} + */ + +#define HCCHAR_CTRL 0U +#define HCCHAR_ISOC 1U +#define HCCHAR_BULK 2U +#define HCCHAR_INTR 3U + +#define GRXSTS_PKTSTS_IN 2U +#define GRXSTS_PKTSTS_IN_XFER_COMP 3U +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5U +#define GRXSTS_PKTSTS_CH_HALTED 7U + +#define CLEAR_INTERRUPT_MASK 0xFFFFFFFFU + +#define HC_MAX_PKT_CNT 256U + +#define USBx_PCGCCTL *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_PCGCCTL_BASE) +#define USBx_HPRT0 *(__IO uint32_t *)((uint32_t)USBx_BASE + USB_OTG_HOST_PORT_BASE) + +#define USBx_DEVICE ((USB_OTG_DeviceTypeDef *)(USBx_BASE + USB_OTG_DEVICE_BASE)) +#define USBx_INEP(i) ((USB_OTG_INEndpointTypeDef *)(USBx_BASE\ + + USB_OTG_IN_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) + +#define USBx_OUTEP(i) ((USB_OTG_OUTEndpointTypeDef *)(USBx_BASE\ + + USB_OTG_OUT_ENDPOINT_BASE + ((i) * USB_OTG_EP_REG_SIZE))) + +#define USBx_DFIFO(i) *(__IO uint32_t *)(USBx_BASE + USB_OTG_FIFO_BASE + ((i) * USB_OTG_FIFO_SIZE)) + +#define USBx_HOST ((USB_OTG_HostTypeDef *)(USBx_BASE + USB_OTG_HOST_BASE)) +#define USBx_HC(i) ((USB_OTG_HostChannelTypeDef *)(USBx_BASE\ + + USB_OTG_HOST_CHANNEL_BASE\ + + ((i) * USB_OTG_HOST_CHANNEL_SIZE))) + + +#define EP_ADDR_MSK 0xFU +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +#define BTABLE_ADDRESS 0x000U +#define PMA_ACCESS 2U + +#ifndef USB_EP_RX_STRX +#define USB_EP_RX_STRX (0x3U << 12) +#endif /* USB_EP_RX_STRX */ + +#define EP_ADDR_MSK 0x7U + +#ifndef USE_USB_DOUBLE_BUFFER +#define USE_USB_DOUBLE_BUFFER 1U +#endif /* USE_USB_DOUBLE_BUFFER */ +#endif /* defined (USB) */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup USB_LL_Exported_Macros USB Low Layer Exported Macros + * @{ + */ +#if defined (USB_OTG_FS) +#define USB_MASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK &= ~(__INTERRUPT__)) +#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__)) + +#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__)) +#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__)) +#endif /* defined (USB_OTG_FS) */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup USB_LL_Exported_Functions USB Low Layer Exported Functions + * @{ + */ +#if defined (USB_OTG_FS) +HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); +HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); +HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, uint32_t hclk, uint8_t speed); +HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_ModeTypeDef mode); +HAL_StatusTypeDef USB_SetDevSpeed(const USB_OTG_GlobalTypeDef *USBx, uint8_t speed); +HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num); +HAL_StatusTypeDef USB_ActivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_DeactivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_WritePacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *src, + uint8_t ch_ep_num, uint16_t len); + +void *USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len); +HAL_StatusTypeDef USB_EPSetStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPClearStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPStopXfer(const USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); +HAL_StatusTypeDef USB_SetDevAddress(const USB_OTG_GlobalTypeDef *USBx, uint8_t address); +HAL_StatusTypeDef USB_DevConnect(const USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DevDisconnect(const USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_ActivateSetup(const USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_EP0_OutStart(const USB_OTG_GlobalTypeDef *USBx, const uint8_t *psetup); +uint8_t USB_GetDevSpeed(const USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef const *USBx); +uint32_t USB_ReadChInterrupts(const USB_OTG_GlobalTypeDef *USBx, uint8_t chnum); +uint32_t USB_ReadDevAllOutEpInterrupt(const USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadDevOutEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); +uint32_t USB_ReadDevAllInEpInterrupt(const USB_OTG_GlobalTypeDef *USBx); +uint32_t USB_ReadDevInEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum); +void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt); + +HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); +HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq); +HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state); +uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx); +uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx); +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps); +HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, + USB_OTG_HCTypeDef *hc); + +uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); +HAL_StatusTypeDef USB_DoPing(const USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num); +HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_ActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx); +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx); +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +HAL_StatusTypeDef USB_CoreInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg); +HAL_StatusTypeDef USB_DevInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg); +HAL_StatusTypeDef USB_EnableGlobalInt(USB_TypeDef *USBx); +HAL_StatusTypeDef USB_DisableGlobalInt(USB_TypeDef *USBx); +HAL_StatusTypeDef USB_SetCurrentMode(USB_TypeDef *USBx, USB_ModeTypeDef mode); +HAL_StatusTypeDef USB_SetDevSpeed(USB_TypeDef *USBx, uint8_t speed); + +HAL_StatusTypeDef USB_FlushRxFifo(USB_TypeDef const *USBx); +HAL_StatusTypeDef USB_FlushTxFifo(USB_TypeDef const *USBx, uint32_t num); + +#if defined (HAL_PCD_MODULE_ENABLED) +HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep); +HAL_StatusTypeDef USB_DeactivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPSetStall(USB_TypeDef *USBx, USB_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPClearStall(USB_TypeDef *USBx, USB_EPTypeDef *ep); +HAL_StatusTypeDef USB_EPStopXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep); +#endif /* defined (HAL_PCD_MODULE_ENABLED) */ + +HAL_StatusTypeDef USB_SetDevAddress(USB_TypeDef *USBx, uint8_t address); +HAL_StatusTypeDef USB_DevConnect(USB_TypeDef *USBx); +HAL_StatusTypeDef USB_DevDisconnect(USB_TypeDef *USBx); +HAL_StatusTypeDef USB_StopDevice(USB_TypeDef *USBx); +HAL_StatusTypeDef USB_EP0_OutStart(USB_TypeDef *USBx, uint8_t *psetup); +HAL_StatusTypeDef USB_WritePacket(USB_TypeDef *USBx, uint8_t *src, + uint8_t ch_ep_num, uint16_t len); + +void *USB_ReadPacket(USB_TypeDef *USBx, uint8_t *dest, uint16_t len); + +uint32_t USB_ReadInterrupts(USB_TypeDef const *USBx); +uint32_t USB_ReadDevAllOutEpInterrupt(USB_TypeDef *USBx); +uint32_t USB_ReadDevOutEPInterrupt(USB_TypeDef *USBx, uint8_t epnum); +uint32_t USB_ReadDevAllInEpInterrupt(USB_TypeDef *USBx); +uint32_t USB_ReadDevInEPInterrupt(USB_TypeDef *USBx, uint8_t epnum); +void USB_ClearInterrupts(USB_TypeDef *USBx, uint32_t interrupt); +HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_TypeDef *USBx); +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_TypeDef *USBx); + +void USB_WritePMA(USB_TypeDef const *USBx, uint8_t *pbUsrBuf, + uint16_t wPMABufAddr, uint16_t wNBytes); + +void USB_ReadPMA(USB_TypeDef const *USBx, uint8_t *pbUsrBuf, + uint16_t wPMABufAddr, uint16_t wNBytes); +#endif /* defined (USB) */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB) || defined (USB_OTG_FS) */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +#endif /* STM32F1xx_LL_USB_H */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_utils.h b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_utils.h new file mode 100644 index 0000000..69483bd --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_utils.h @@ -0,0 +1,270 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_utils.h + * @author MCD Application Team + * @brief Header file of UTILS 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. + * + ****************************************************************************** + @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 + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F1xx_LL_UTILS_H +#define __STM32F1xx_LL_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" + +/** @addtogroup STM32F1xx_LL_Driver + * @{ + */ + +/** @defgroup UTILS_LL UTILS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Constants UTILS Private Constants + * @{ + */ + +/* Max delay can be used in LL_mDelay */ +#define LL_MAX_DELAY 0xFFFFFFFFU + +/** + * @brief Unique device ID register base address + */ +#define UID_BASE_ADDRESS UID_BASE + +/** + * @brief Flash size data register base address + */ +#define FLASHSIZE_BASE_ADDRESS FLASHSIZE_BASE + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Macros UTILS Private Macros + * @{ + */ +/** + * @} + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup UTILS_LL_ES_INIT UTILS Exported structures + * @{ + */ +/** + * @brief UTILS PLL structure definition + */ +typedef struct +{ + uint32_t PLLMul; /*!< Multiplication factor for PLL VCO input clock. + This parameter can be a value of @ref RCC_LL_EC_PLL_MUL + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ + + uint32_t Prediv; /*!< Division factor for HSE used as PLL clock source. + This parameter can be a value of @ref RCC_LL_EC_PREDIV_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ +} LL_UTILS_PLLInitTypeDef; + +/** + * @brief UTILS System, AHB and APB buses clock configuration structure definition + */ +typedef struct +{ + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAHBPrescaler(). */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB1_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB1Prescaler(). */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB2_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB2Prescaler(). */ + +} LL_UTILS_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants + * @{ + */ + +/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation + * @{ + */ +#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */ +#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions + * @{ + */ + +/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE + * @{ + */ + +/** + * @brief Get Word0 of the unique device identifier (UID based on 96 bits) + * @retval UID[31:0] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word0(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS))); +} + +/** + * @brief Get Word1 of the unique device identifier (UID based on 96 bits) + * @retval UID[63:32] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word1(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 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 (uint16_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS))); +} + + +/** + * @} + */ + +/** @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); +#if defined(FLASH_ACR_LATENCY) +ErrorStatus LL_SetFlashLatency(uint32_t Frequency); +#endif /* FLASH_ACR_LATENCY */ +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); +#if defined(RCC_PLL2_SUPPORT) +ErrorStatus LL_PLL_ConfigSystemClock_PLL2(uint32_t HSEFrequency, uint32_t HSEBypass, LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_PLLInitTypeDef *UTILS_PLL2InitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +#endif /* RCC_PLL2_SUPPORT */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F1xx_LL_UTILS_H */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/LICENSE.txt b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/LICENSE.txt new file mode 100644 index 0000000..3edc4d1 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/LICENSE.txt @@ -0,0 +1,6 @@ +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/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c new file mode 100644 index 0000000..da80972 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c @@ -0,0 +1,607 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal.c + * @author MCD Application Team + * @brief HAL module driver. + * This is the common part of the HAL initialization + * + ****************************************************************************** + * @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 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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL HAL + * @brief HAL module driver. + * @{ + */ + +#ifdef HAL_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/** @defgroup HAL_Private_Constants HAL Private Constants + * @{ + */ +/** + * @brief STM32F1xx HAL Driver version number + */ +#define __STM32F1xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F1xx_HAL_VERSION_SUB1 (0x01U) /*!< [23:16] sub1 version */ +#define __STM32F1xx_HAL_VERSION_SUB2 (0x0AU) /*!< [15:8] sub2 version */ +#define __STM32F1xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F1xx_HAL_VERSION ((__STM32F1xx_HAL_VERSION_MAIN << 24)\ + |(__STM32F1xx_HAL_VERSION_SUB1 << 16)\ + |(__STM32F1xx_HAL_VERSION_SUB2 << 8 )\ + |(__STM32F1xx_HAL_VERSION_RC)) + +#define IDCODE_DEVID_MASK 0x00000FFFU + +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/** @defgroup HAL_Private_Variables 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 -----------------------------------------------*/ +/* Exported 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 de-initialization 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. + * 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 + * "stm32f1xx_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 */ +#if (PREFETCH_ENABLE != 0) +#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \ + defined(STM32F102x6) || defined(STM32F102xB) || \ + defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \ + defined(STM32F105xC) || defined(STM32F107xC) + + /* Prefetch buffer is not available on value line devices */ + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); +#endif +#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. + * of time base. + * @note 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(); + +#if defined(STM32F105xC) || defined(STM32F107xC) + __HAL_RCC_AHB_FORCE_RESET(); + __HAL_RCC_AHB_RELEASE_RESET(); +#endif + + /* 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 */ + CLEAR_BIT(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 */ + SET_BIT(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 __STM32F1xx_HAL_VERSION; +} + +/** + * @brief Returns the device revision identifier. + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @retval Device revision identifier + */ +uint32_t HAL_GetREVID(void) +{ + return ((DBGMCU->IDCODE) >> DBGMCU_IDCODE_REV_ID_Pos); +} + +/** + * @brief Returns the device identifier. + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @retval Device identifier + */ +uint32_t HAL_GetDEVID(void) +{ + return ((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); +} + +/** + * @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)))); +} + +/** + * @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 + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @retval None + */ +void HAL_DBGMCU_DisableDBGSleepMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Enable the Debug Module during STOP mode + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * Note: On all STM32F1 devices: + * If the system tick timer interrupt is enabled during the Stop mode + * debug (DBG_STOP bit set in the DBGMCU_CR register ), it will wakeup + * the system from Stop mode. + * Workaround: To debug the Stop mode, disable the system tick timer + * interrupt. + * Refer to errata sheet of these devices for more details. + * Note: On all STM32F1 devices: + * If the system tick timer interrupt is enabled during the Stop mode + * debug (DBG_STOP bit set in the DBGMCU_CR register ), it will wakeup + * the system from Stop mode. + * Workaround: To debug the Stop mode, disable the system tick timer + * interrupt. + * Refer to errata sheet of these devices for more details. + * @retval None + */ +void HAL_DBGMCU_EnableDBGStopMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Disable the Debug Module during STOP mode + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @retval None + */ +void HAL_DBGMCU_DisableDBGStopMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Enable the Debug Module during STANDBY mode + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @retval None + */ +void HAL_DBGMCU_EnableDBGStandbyMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Disable the Debug Module during STANDBY mode + * Note: On devices STM32F10xx8 and STM32F10xxB, + * STM32F101xC/D/E and STM32F103xC/D/E, + * STM32F101xF/G and STM32F103xF/G + * STM32F10xx4 and STM32F10xx6 + * Debug registers DBGMCU_IDCODE and DBGMCU_CR are accessible only in + * debug mode (not accessible by the user software in normal mode). + * Refer to errata sheet of these devices for more details. + * @retval None + */ +void HAL_DBGMCU_DisableDBGStandbyMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c new file mode 100644 index 0000000..9342123 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c @@ -0,0 +1,529 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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-M3 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 stm32f1xx_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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_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 (stm32f10xx.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 (stm32f10xxx.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 (stm32f10xxx.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 Enable 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 Disable 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 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 (stm32f10xxx.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 (stm32f10xxx.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 (stm32f10xxx.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 (stm32f10xxx.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 (stm32f10xxx.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/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c new file mode 100644 index 0000000..80b65a4 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c @@ -0,0 +1,897 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 Channel + (except for internal SRAM / FLASH memories: no initialization is + necessary). Please refer to the Reference manual for connection between peripherals + and DMA requests. + + (#) For a given Channel, program the required configuration through the following parameters: + Channel request, Transfer Direction, Source and Destination data formats, + Circular or Normal mode, Channel Priority level, Source and Destination Increment mode + using HAL_DMA_Init() function. + + (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error + detection. + + (#) Use HAL_DMA_Abort() function to abort the current transfer + + -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. + *** 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. + + *** 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). + + *** DMA HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in DMA HAL driver. + + (+) __HAL_DMA_ENABLE: Enable the specified DMA Channel. + (+) __HAL_DMA_DISABLE: Disable the specified DMA Channel. + (+) __HAL_DMA_GET_FLAG: Get the DMA Channel pending flags. + (+) __HAL_DMA_CLEAR_FLAG: Clear the DMA Channel pending flags. + (+) __HAL_DMA_ENABLE_IT: Enable the specified DMA Channel interrupts. + (+) __HAL_DMA_DISABLE_IT: Disable the specified DMA Channel interrupts. + (+) __HAL_DMA_GET_IT_SOURCE: Check whether the specified DMA Channel interrupt has occurred or not. + + [..] + (@) You can refer to the DMA HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup DMA DMA + * @brief DMA HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup DMA_Private_Functions DMA Private Functions + * @{ + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Functions DMA Exported Functions + * @{ + */ + +/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize the DMA Channel source + and destination addresses, incrementation and data sizes, transfer direction, + circular/normal mode selection, memory-to-memory mode selection and Channel 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 initialize the associated handle. + * @param hdma: Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) +{ + uint32_t tmp = 0U; + + /* Check the DMA handle allocation */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + 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)); + +#if defined (DMA2) + /* calculation of the channel index */ + if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel1)) + { + /* DMA1 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2; + hdma->DmaBaseAddress = DMA1; + } + else + { + /* DMA2 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA2_Channel1) / ((uint32_t)DMA2_Channel2 - (uint32_t)DMA2_Channel1)) << 2; + hdma->DmaBaseAddress = DMA2; + } +#else + /* DMA1 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2; + hdma->DmaBaseAddress = DMA1; +#endif /* DMA2 */ + + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Get the CR register value */ + tmp = hdma->Instance->CCR; + + /* Clear PL, MSIZE, PSIZE, MINC, PINC, CIRC and DIR bits */ + tmp &= ((uint32_t)~(DMA_CCR_PL | DMA_CCR_MSIZE | DMA_CCR_PSIZE | \ + DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_CIRC | \ + DMA_CCR_DIR)); + + /* Prepare the DMA Channel configuration */ + tmp |= hdma->Init.Direction | + hdma->Init.PeriphInc | hdma->Init.MemInc | + hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + hdma->Init.Mode | hdma->Init.Priority; + + /* Write to DMA Channel CR register */ + hdma->Instance->CCR = tmp; + + /* Initialise the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Initialize the DMA state*/ + hdma->State = HAL_DMA_STATE_READY; + /* Allocate lock resource and initialize it */ + hdma->Lock = HAL_UNLOCKED; + + return HAL_OK; +} + +/** + * @brief DeInitialize the DMA peripheral. + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) +{ + /* Check the DMA handle allocation */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + + /* Disable the selected DMA Channelx */ + __HAL_DMA_DISABLE(hdma); + + /* Reset DMA Channel control register */ + hdma->Instance->CCR = 0U; + + /* Reset DMA Channel Number of Data to Transfer register */ + hdma->Instance->CNDTR = 0U; + + /* Reset DMA Channel peripheral address register */ + hdma->Instance->CPAR = 0U; + + /* Reset DMA Channel memory address register */ + hdma->Instance->CMAR = 0U; + +#if defined (DMA2) + /* calculation of the channel index */ + if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel1)) + { + /* DMA1 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2; + hdma->DmaBaseAddress = DMA1; + } + else + { + /* DMA2 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA2_Channel1) / ((uint32_t)DMA2_Channel2 - (uint32_t)DMA2_Channel1)) << 2; + hdma->DmaBaseAddress = DMA2; + } +#else + /* DMA1 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2; + hdma->DmaBaseAddress = DMA1; +#endif /* DMA2 */ + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex)); + + /* Clean all callbacks */ + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + + /* 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; +} + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group2 Input and Output operation functions + * @brief Input and Output operation functions + * +@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 Start the DMA Transfer. + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @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; + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Disable the peripheral */ + __HAL_DMA_DISABLE(hdma); + + /* Configure the source, destination address and the data length & clear flags*/ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + 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 Channel. + * @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; + + /* 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; + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Disable the peripheral */ + __HAL_DMA_DISABLE(hdma); + + /* Configure the source, destination address and the data length & clear flags*/ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the transfer complete interrupt */ + /* Enable the transfer Error interrupt */ + if(NULL != hdma->XferHalfCpltCallback) + { + /* Enable the Half transfer complete interrupt as well */ + __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE)); + } + else + { + __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT); + __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_TE)); + } + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Remain BUSY */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Abort the DMA Transfer. + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(hdma->State != HAL_DMA_STATE_BUSY) + { + /* no transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + else + + { + /* Disable DMA IT */ + __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE)); + + /* Disable the channel */ + __HAL_DMA_DISABLE(hdma); + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << hdma->ChannelIndex); + } + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @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 Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(HAL_DMA_STATE_BUSY != hdma->State) + { + /* no transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + status = HAL_ERROR; + } + else + { + /* Disable DMA IT */ + __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE)); + + /* Disable the channel */ + __HAL_DMA_DISABLE(hdma); + + /* Clear all flags */ + __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_GI_FLAG_INDEX(hdma)); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Call User Abort callback */ + if(hdma->XferAbortCallback != NULL) + { + hdma->XferAbortCallback(hdma); + } + } + return status; +} + +/** + * @brief Polling for transfer complete. + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @param CompleteLevel: Specifies the DMA level complete. + * @param Timeout: Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, uint32_t CompleteLevel, uint32_t Timeout) +{ + uint32_t temp; + uint32_t tickstart = 0U; + + 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 */ + if (RESET != (hdma->Instance->CCR & DMA_CCR_CIRC)) + { + 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 */ + temp = __HAL_DMA_GET_TC_FLAG_INDEX(hdma); + } + else + { + /* Half Transfer Complete flag */ + temp = __HAL_DMA_GET_HT_FLAG_INDEX(hdma); + } + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_DMA_GET_FLAG(hdma, temp) == RESET) + { + if((__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)) != RESET)) + { + /* When a DMA transfer error occurs */ + /* A hardware clear of its EN bits is performed */ + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << hdma->ChannelIndex); + + /* Update error code */ + SET_BIT(hdma->ErrorCode, HAL_DMA_ERROR_TE); + + /* Change the DMA state */ + hdma->State= HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + /* Check for the Timeout */ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) + { + /* Update error code */ + SET_BIT(hdma->ErrorCode, HAL_DMA_ERROR_TIMEOUT); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + } + } + + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Clear the transfer complete flag */ + __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); + + /* The selected Channelx EN bit is cleared (DMA is disabled and + all transfers are complete) */ + hdma->State = HAL_DMA_STATE_READY; + } + else + { + /* Clear the half transfer complete flag */ + __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); + } + + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @brief Handles DMA interrupt request. + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval None + */ +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) +{ + uint32_t flag_it = hdma->DmaBaseAddress->ISR; + uint32_t source_it = hdma->Instance->CCR; + + /* Half Transfer Complete Interrupt management ******************************/ + if (((flag_it & (DMA_FLAG_HT1 << hdma->ChannelIndex)) != RESET) && ((source_it & DMA_IT_HT) != RESET)) + { + /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ + if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) + { + /* Disable the half transfer interrupt */ + __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT); + } + /* Clear the half transfer complete flag */ + __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); + + /* DMA peripheral state is not updated in Half Transfer */ + /* but in Transfer Complete case */ + + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + + /* Transfer Complete Interrupt management ***********************************/ + else if (((flag_it & (DMA_FLAG_TC1 << hdma->ChannelIndex)) != RESET) && ((source_it & DMA_IT_TC) != RESET)) + { + if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) + { + /* Disable the transfer complete and error interrupt */ + __HAL_DMA_DISABLE_IT(hdma, DMA_IT_TE | DMA_IT_TC); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + } + /* Clear the transfer complete flag */ + __HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete callback */ + hdma->XferCpltCallback(hdma); + } + } + + /* Transfer Error Interrupt management **************************************/ + else if (( RESET != (flag_it & (DMA_FLAG_TE1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TE))) + { + /* When a DMA transfer error occurs */ + /* A hardware clear of its EN bits is performed */ + /* Disable ALL DMA IT */ + __HAL_DMA_DISABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE)); + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << hdma->ChannelIndex); + + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TE; + + /* 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); + } + } + return; +} + +/** + * @brief Register callbacks + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @param CallbackID: User Callback identifier + * a HAL_DMA_CallbackIDTypeDef ENUM 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_ERROR_CB_ID: + hdma->XferErrorCallback = pCallback; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = pCallback; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + 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 Channel. + * @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_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->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group3 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 DMA state + (+) Get error code + +@endverbatim + * @{ + */ + +/** + * @brief Return the DMA handle state. + * @param hdma: pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL state + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) +{ + /* Return DMA handle state */ + 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 Channel. + * @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 Channel. + * @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 all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << hdma->ChannelIndex); + + /* Configure DMA Channel data length */ + hdma->Instance->CNDTR = DataLength; + + /* Memory to Peripheral */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Channel destination address */ + hdma->Instance->CPAR = DstAddress; + + /* Configure DMA Channel source address */ + hdma->Instance->CMAR = SrcAddress; + } + /* Peripheral to Memory */ + else + { + /* Configure DMA Channel source address */ + hdma->Instance->CPAR = SrcAddress; + + /* Configure DMA Channel destination address */ + hdma->Instance->CMAR = DstAddress; + } +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c new file mode 100644 index 0000000..ef8e005 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c @@ -0,0 +1,553 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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) 2019 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### 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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_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 = AFIO->EXTICR[linepos >> 2u]; + regval &= ~(AFIO_EXTICR1_EXTI0 << (AFIO_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (AFIO_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + AFIO->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 = AFIO->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = (regval >> (AFIO_EXTICR1_EXTI1_Pos * (linepos & 0x03u))) & AFIO_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 = AFIO->EXTICR[linepos >> 2u]; + regval &= ~(AFIO_EXTICR1_EXTI0 << (AFIO_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + AFIO->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 maskline; + uint32_t linepos; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Prevent unused argument compilation warning */ + UNUSED(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; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + assert_param(IS_EXTI_PENDING_EDGE(Edge)); + + /* Prevent unused argument compilation warning */ + UNUSED(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/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c new file mode 100644 index 0000000..fe5e596 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c @@ -0,0 +1,959 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 State 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. + + [..] The FLASH main features are: + (+) Flash memory read operations + (+) Flash memory program/erase operations + (+) Read / write protections + (+) Prefetch on I-Code + (+) Option Bytes programming + + + ##### How to use this driver ##### + ============================================================================== + [..] + This driver provides functions and macros to configure and program the FLASH + memory of all STM32F1xx devices. + + (#) FLASH Memory I/O Programming functions: this group includes all needed + functions to erase and program the main memory: + (++) Lock and Unlock the FLASH interface + (++) Erase function: Erase page, erase all pages + (++) Program functions: half word, word and doubleword + (#) FLASH Option Bytes Programming functions: this group includes all needed + functions to manage the Option Bytes: + (++) Lock and Unlock the Option Bytes + (++) Set/Reset the write protection + (++) Set the Read protection Level + (++) Program the user Option Bytes + (++) Launch the Option Bytes loader + (++) Erase Option Bytes + (++) Program the data Option Bytes + (++) Get the Write protection. + (++) Get the user option bytes. + + (#) Interrupts and flags management functions : this group + includes all needed functions to: + (++) Handle FLASH interrupts + (++) Wait for last FLASH operation according to its status + (++) Get error flag status + + [..] In addition to these function, this driver includes a set of macros allowing + to handle the following operations: + + (+) Set/Get the latency + (+) Enable/Disable the prefetch buffer + (+) Enable/Disable the half cycle access + (+) Enable/Disable the FLASH interrupts + (+) Monitor the FLASH flags status + + @endverbatim + ****************************************************************************** + * @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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/** @defgroup FLASH FLASH + * @brief FLASH HAL module driver + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup FLASH_Private_Constants FLASH Private Constants + * @{ + */ +/** + * @} + */ + +/* Private macro ---------------------------- ---------------------------------*/ +/** @defgroup FLASH_Private_Macros FLASH Private Macros + * @{ + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Variables FLASH Private Variables + * @{ + */ +/* Variables used for Erase pages under interruption*/ +FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup FLASH_Private_Functions FLASH Private Functions + * @{ + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); +static void FLASH_SetErrorCode(void); +extern void FLASH_PageErase(uint32_t PageAddress); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Functions FLASH Exported Functions + * @{ + */ + +/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions + * @brief Programming operation functions + * +@verbatim +@endverbatim + * @{ + */ + +/** + * @brief Program halfword, word or double word at a specified address + * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @note FLASH should be previously erased before new programmation (only exception to this + * is when 0x0000 is programmed) + * + * @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 = HAL_ERROR; + uint8_t index = 0; + uint8_t nbiterations = 0; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + +#if defined(FLASH_BANK2_END) + if(Address <= FLASH_BANK1_END) + { +#endif /* FLASH_BANK2_END */ + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); +#if defined(FLASH_BANK2_END) + } + else + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperationBank2(FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_BANK2_END */ + + if(status == HAL_OK) + { + if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /* Program halfword (16-bit) at a specified address. */ + nbiterations = 1U; + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /* Program word (32-bit = 2*16-bit) at a specified address. */ + nbiterations = 2U; + } + else + { + /* Program double word (64-bit = 4*16-bit) at a specified address. */ + nbiterations = 4U; + } + + for (index = 0U; index < nbiterations; index++) + { + FLASH_Program_HalfWord((Address + (2U*index)), (uint16_t)(Data >> (16U*index))); + +#if defined(FLASH_BANK2_END) + if(Address <= FLASH_BANK1_END) + { +#endif /* FLASH_BANK2_END */ + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the PG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PG); +#if defined(FLASH_BANK2_END) + } + else + { + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperationBank2(FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the PG Bit */ + CLEAR_BIT(FLASH->CR2, FLASH_CR2_PG); + } +#endif /* FLASH_BANK2_END */ + /* In case of error, stop programation procedure */ + if (status != HAL_OK) + { + break; + } + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Program halfword, word or double word at a specified address with interrupt enabled. + * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @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_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + +#if defined(FLASH_BANK2_END) + /* If procedure already ongoing, reject the next one */ + if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + { + return HAL_ERROR; + } + + if(Address <= FLASH_BANK1_END) + { + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP_BANK1 | FLASH_IT_ERR_BANK1); + + }else + { + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP_BANK2 | FLASH_IT_ERR_BANK2); + } +#else + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); +#endif /* FLASH_BANK2_END */ + + pFlash.Address = Address; + pFlash.Data = Data; + + if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMHALFWORD; + /* Program halfword (16-bit) at a specified address. */ + pFlash.DataRemaining = 1U; + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMWORD; + /* Program word (32-bit : 2*16-bit) at a specified address. */ + pFlash.DataRemaining = 2U; + } + else + { + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMDOUBLEWORD; + /* Program double word (64-bit : 4*16-bit) at a specified address. */ + pFlash.DataRemaining = 4U; + } + + /* Program halfword (16-bit) at a specified address. */ + FLASH_Program_HalfWord(Address, (uint16_t)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_BANK2_END) + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR_BANK1) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR_BANK1) || \ + (__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR_BANK2) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR_BANK2))) +#else + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) +#endif /* FLASH_BANK2_END */ + { + /* Return the faulty address */ + addresstmp = pFlash.Address; + /* Reset address */ + pFlash.Address = 0xFFFFFFFFU; + + /* 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 defined(FLASH_BANK2_END) + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP_BANK1)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP_BANK1); +#else + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); +#endif /* FLASH_BANK2_END */ + + /* Process can continue only if no error detected */ + if(pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) + { + /* Nb of pages to erased can be decreased */ + pFlash.DataRemaining--; + + /* Check if there are still pages to erase */ + if(pFlash.DataRemaining != 0U) + { + addresstmp = pFlash.Address; + /*Indicate user which sector has been erased */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + + /*Increment sector number*/ + addresstmp = pFlash.Address + FLASH_PAGE_SIZE; + pFlash.Address = addresstmp; + + /* If the erase operation is completed, disable the PER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PER); + + FLASH_PageErase(addresstmp); + } + else + { + /* No more pages to Erase, user callback can be called. */ + /* Reset Sector and stop Erase pages procedure */ + pFlash.Address = addresstmp = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + } + } + else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /* Operation is completed, disable the MER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + +#if defined(FLASH_BANK2_END) + /* Stop Mass Erase procedure if no pending mass erase on other bank */ + if (HAL_IS_BIT_CLR(FLASH->CR2, FLASH_CR2_MER)) + { +#endif /* FLASH_BANK2_END */ + /* MassErase ended. Return the selected bank */ + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(0U); + + /* Stop Mass Erase procedure*/ + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } +#if defined(FLASH_BANK2_END) + } +#endif /* FLASH_BANK2_END */ + else + { + /* Nb of 16-bit data to program can be decreased */ + pFlash.DataRemaining--; + + /* Check if there are still 16-bit data to program */ + if(pFlash.DataRemaining != 0U) + { + /* Increment address to 16-bit */ + pFlash.Address += 2U; + addresstmp = pFlash.Address; + + /* Shift to have next 16-bit data */ + pFlash.Data = (pFlash.Data >> 16U); + + /* Operation is completed, disable the PG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PG); + + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(addresstmp, (uint16_t)pFlash.Data); + } + else + { + /* Program ended. Return the selected address */ + /* FLASH EOP interrupt user callback */ + if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMHALFWORD) + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + else if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMWORD) + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address - 2U); + } + else + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address - 6U); + } + + /* Reset Address and stop Program procedure */ + pFlash.Address = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + } + } + +#if defined(FLASH_BANK2_END) + /* Check FLASH End of Operation flag */ + if(__HAL_FLASH_GET_FLAG( FLASH_FLAG_EOP_BANK2)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP_BANK2); + + /* Process can continue only if no error detected */ + if(pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) + { + /* Nb of pages to erased can be decreased */ + pFlash.DataRemaining--; + + /* Check if there are still pages to erase*/ + if(pFlash.DataRemaining != 0U) + { + /* Indicate user which page address has been erased*/ + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + + /* Increment page address to next page */ + pFlash.Address += FLASH_PAGE_SIZE; + addresstmp = pFlash.Address; + + /* Operation is completed, disable the PER Bit */ + CLEAR_BIT(FLASH->CR2, FLASH_CR2_PER); + + FLASH_PageErase(addresstmp); + } + else + { + /*No more pages to Erase*/ + + /*Reset Address and stop Erase pages procedure*/ + pFlash.Address = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + } + else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /* Operation is completed, disable the MER Bit */ + CLEAR_BIT(FLASH->CR2, FLASH_CR2_MER); + + if (HAL_IS_BIT_CLR(FLASH->CR, FLASH_CR_MER)) + { + /* MassErase ended. Return the selected bank*/ + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(0U); + + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + else + { + /* Nb of 16-bit data to program can be decreased */ + pFlash.DataRemaining--; + + /* Check if there are still 16-bit data to program */ + if(pFlash.DataRemaining != 0U) + { + /* Increment address to 16-bit */ + pFlash.Address += 2U; + addresstmp = pFlash.Address; + + /* Shift to have next 16-bit data */ + pFlash.Data = (pFlash.Data >> 16U); + + /* Operation is completed, disable the PG Bit */ + CLEAR_BIT(FLASH->CR2, FLASH_CR2_PG); + + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(addresstmp, (uint16_t)pFlash.Data); + } + else + { + /*Program ended. Return the selected address*/ + /* FLASH EOP interrupt user callback */ + if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMHALFWORD) + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + else if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMWORD) + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address-2U); + } + else + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address-6U); + } + + /* Reset Address and stop Program procedure*/ + pFlash.Address = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + } + } +#endif + + if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) + { +#if defined(FLASH_BANK2_END) + /* Operation is completed, disable the PG, PER and MER Bits for both bank */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_PER | FLASH_CR_MER)); + CLEAR_BIT(FLASH->CR2, (FLASH_CR2_PG | FLASH_CR2_PER | FLASH_CR2_MER)); + + /* Disable End of FLASH Operation and Error source interrupts for both banks */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP_BANK1 | FLASH_IT_ERR_BANK1 | FLASH_IT_EOP_BANK2 | FLASH_IT_ERR_BANK2); +#else + /* Operation is completed, disable the PG, PER and MER Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_PER | FLASH_CR_MER)); + + /* Disable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); +#endif /* FLASH_BANK2_END */ + + } +} + +/** + * @brief FLASH end of operation interrupt callback + * @param ReturnValue: The value saved in this parameter depends on the ongoing procedure + * - Mass Erase: No return value expected + * - Pages Erase: Address of the page which has been erased + * (if 0xFFFFFFFF, it means that all the selected pages 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: No return value expected + * - Pages Erase: Address of the page 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; + } + } +#if defined(FLASH_BANK2_END) + if(READ_BIT(FLASH->CR2, FLASH_CR2_LOCK) != RESET) + { + /* Authorize the FLASH BANK2 Registers access */ + WRITE_REG(FLASH->KEYR2, FLASH_KEY1); + WRITE_REG(FLASH->KEYR2, FLASH_KEY2); + + /* Verify Flash BANK2 is unlocked */ + if(READ_BIT(FLASH->CR2, FLASH_CR2_LOCK) != RESET) + { + status = HAL_ERROR; + } + } +#endif /* FLASH_BANK2_END */ + + 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 */ + SET_BIT(FLASH->CR, FLASH_CR_LOCK); + +#if defined(FLASH_BANK2_END) + /* Set the LOCK Bit to lock the FLASH BANK2 Registers access */ + SET_BIT(FLASH->CR2, FLASH_CR2_LOCK); + +#endif /* FLASH_BANK2_END */ + return HAL_OK; +} + +/** + * @brief Unlock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) +{ + if (HAL_IS_BIT_CLR(FLASH->CR, FLASH_CR_OPTWRE)) + { + /* Authorizes the Option Byte register programming */ + WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1); + WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2); + } + 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) +{ + /* Clear the OPTWRE Bit to lock the FLASH Option Byte Registers access */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTWRE); + + return HAL_OK; +} + +/** + * @brief Launch the option byte loading. + * @note This function will reset automatically the MCU. + * @retval None + */ +void HAL_FLASH_OB_Launch(void) +{ + /* Initiates a system reset request to launch the option byte loading */ + HAL_NVIC_SystemReset(); +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group3 Peripheral errors functions + * @brief Peripheral errors functions + * +@verbatim + =============================================================================== + ##### Peripheral Errors functions ##### + =============================================================================== + [..] + This subsection permit 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: + * @ref FLASH_Error_Codes + */ +uint32_t HAL_FLASH_GetError(void) +{ + return pFlash.ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup FLASH_Private_Functions + * @{ + */ + +/** + * @brief Program a half-word (16-bit) at a specified address. + * @param Address specify the address to be programmed. + * @param Data specify the data to be programmed. + * @retval None + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) +{ + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + +#if defined(FLASH_BANK2_END) + if(Address <= FLASH_BANK1_END) + { +#endif /* FLASH_BANK2_END */ + /* Proceed to program the new data */ + SET_BIT(FLASH->CR, FLASH_CR_PG); +#if defined(FLASH_BANK2_END) + } + else + { + /* Proceed to program the new data */ + SET_BIT(FLASH->CR2, FLASH_CR2_PG); + } +#endif /* FLASH_BANK2_END */ + + /* Write data in the address */ + *(__IO uint16_t*)Address = Data; +} + +/** + * @brief Wait for a FLASH operation to complete. + * @param Timeout maximum flash operation timeout + * @retval HAL Status + */ +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) +{ + /* 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 */ + + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) + { + 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)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || + __HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR) || + __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + { + /*Save the error code*/ + FLASH_SetErrorCode(); + return HAL_ERROR; + } + + /* There is no error flag set */ + return HAL_OK; +} + +#if defined(FLASH_BANK2_END) +/** + * @brief Wait for a FLASH BANK2 operation to complete. + * @param Timeout maximum flash operation timeout + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef FLASH_WaitForLastOperationBank2(uint32_t Timeout) +{ + /* Wait for the FLASH BANK2 operation to complete by polling on BUSY flag to be reset. + Even if the FLASH BANK2 operation fails, the BUSY flag will be reset and an error + flag will be set */ + + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY_BANK2)) + { + 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_BANK2)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP_BANK2); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR_BANK2) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR_BANK2)) + { + /*Save the error code*/ + FLASH_SetErrorCode(); + return HAL_ERROR; + } + + /* If there is an error flag set */ + return HAL_OK; + +} +#endif /* FLASH_BANK2_END */ + +/** + * @brief Set the specific FLASH error flag. + * @retval None + */ +static void FLASH_SetErrorCode(void) +{ + uint32_t flags = 0U; + +#if defined(FLASH_BANK2_END) + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR_BANK2)) +#else + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) +#endif /* FLASH_BANK2_END */ + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; +#if defined(FLASH_BANK2_END) + flags |= FLASH_FLAG_WRPERR | FLASH_FLAG_WRPERR_BANK2; +#else + flags |= FLASH_FLAG_WRPERR; +#endif /* FLASH_BANK2_END */ + } +#if defined(FLASH_BANK2_END) + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR) || __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR_BANK2)) +#else + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) +#endif /* FLASH_BANK2_END */ + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PROG; +#if defined(FLASH_BANK2_END) + flags |= FLASH_FLAG_PGERR | FLASH_FLAG_PGERR_BANK2; +#else + flags |= FLASH_FLAG_PGERR; +#endif /* FLASH_BANK2_END */ + } + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_OPTVERR)) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_OPTV; + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR); + } + + /* Clear FLASH error pending bits */ + __HAL_FLASH_CLEAR_FLAG(flags); +} +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c new file mode 100644 index 0000000..33ae03c --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c @@ -0,0 +1,1121 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 peripheral: + * + Extended Initialization/de-initialization functions + * + Extended I/O operation functions + * + Extended Peripheral Control functions + * + @verbatim + ============================================================================== + ##### Flash peripheral extended features ##### + ============================================================================== + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the FLASH memory + of all STM32F1xxx devices. It includes + + (++) Set/Reset the write protection + (++) Program the user Option Bytes + (++) Get the Read protection Level + + @endverbatim + ****************************************************************************** + * @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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ +#ifdef HAL_FLASH_MODULE_ENABLED + +/** @addtogroup FLASH + * @{ + */ +/** @addtogroup FLASH_Private_Variables + * @{ + */ +/* Variables used for Erase pages under interruption*/ +extern FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FLASHEx FLASHEx + * @brief FLASH HAL Extension module driver + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Constants FLASHEx Private Constants + * @{ + */ +#define FLASH_POSITION_IWDGSW_BIT FLASH_OBR_IWDG_SW_Pos +#define FLASH_POSITION_OB_USERDATA0_BIT FLASH_OBR_DATA0_Pos +#define FLASH_POSITION_OB_USERDATA1_BIT FLASH_OBR_DATA1_Pos +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros + * @{ + */ +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions + * @{ + */ +/* Erase operations */ +static void FLASH_MassErase(uint32_t Banks); +void FLASH_PageErase(uint32_t PageAddress); + +/* Option bytes control */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage); +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage); +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel); +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig); +static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data); +static uint32_t FLASH_OB_GetWRP(void); +static uint32_t FLASH_OB_GetRDP(void); +static uint8_t FLASH_OB_GetUser(void); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + * @{ + */ + +/** @defgroup FLASHEx_Exported_Functions_Group1 FLASHEx Memory Erasing functions + * @brief FLASH Memory Erasing functions + * +@verbatim + ============================================================================== + ##### FLASH Erasing Programming functions ##### + ============================================================================== + + [..] The FLASH Memory Erasing functions, includes the following functions: + (+) HAL_FLASHEx_Erase: return only when erase has been done + (+) HAL_FLASHEx_Erase_IT: end of erase is done when HAL_FLASH_EndOfOperationCallback + is called with parameter 0xFFFFFFFF + + [..] Any operation of erase should follow these steps: + (#) Call the HAL_FLASH_Unlock() function to enable the flash control register and + program memory access. + (#) Call the desired function to erase page. + (#) Call the HAL_FLASH_Lock() to disable the flash program memory access + (recommended to protect the FLASH memory against possible unwanted operation). + +@endverbatim + * @{ + */ + + +/** + * @brief Perform a mass erase or erase the specified FLASH memory pages + * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function + * must be called before. + * Call the @ref HAL_FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation) + * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @param[out] PageError pointer to variable that + * contains the configuration information on faulty page in case of error + * (0xFFFFFFFF means that all the pages have been correctly erased) + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError) +{ + HAL_StatusTypeDef status = HAL_ERROR; + uint32_t address = 0U; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { +#if defined(FLASH_BANK2_END) + if (pEraseInit->Banks == FLASH_BANK_BOTH) + { + /* Mass Erase requested for Bank1 and Bank2 */ + /* Wait for last operation to be completed */ + if ((FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) && \ + (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)) + { + /*Mass erase to be done*/ + FLASH_MassErase(FLASH_BANK_BOTH); + + /* Wait for last operation to be completed */ + if ((FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) && \ + (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK)) + { + status = HAL_OK; + } + + /* If the erase operation is completed, disable the MER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + CLEAR_BIT(FLASH->CR2, FLASH_CR2_MER); + } + } + else if (pEraseInit->Banks == FLASH_BANK_2) + { + /* Mass Erase requested for Bank2 */ + /* Wait for last operation to be completed */ + if (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + { + /*Mass erase to be done*/ + FLASH_MassErase(FLASH_BANK_2); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the MER Bit */ + CLEAR_BIT(FLASH->CR2, FLASH_CR2_MER); + } + } + else +#endif /* FLASH_BANK2_END */ + { + /* Mass Erase requested for Bank1 */ + /* Wait for last operation to be completed */ + if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + { + /*Mass erase to be done*/ + FLASH_MassErase(FLASH_BANK_1); + + /* 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 */ + CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + } + } + } + else + { + /* Page Erase is requested */ + /* Check the parameters */ + assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress)); + assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + +#if defined(FLASH_BANK2_END) + /* Page Erase requested on address located on bank2 */ + if(pEraseInit->PageAddress > FLASH_BANK1_END) + { + /* Wait for last operation to be completed */ + if (FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + { + /*Initialization of PageError variable*/ + *PageError = 0xFFFFFFFFU; + + /* Erase by page by page to be done*/ + for(address = pEraseInit->PageAddress; + address < (pEraseInit->PageAddress + (pEraseInit->NbPages)*FLASH_PAGE_SIZE); + address += FLASH_PAGE_SIZE) + { + FLASH_PageErase(address); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperationBank2((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the PER Bit */ + CLEAR_BIT(FLASH->CR2, FLASH_CR2_PER); + + if (status != HAL_OK) + { + /* In case of error, stop erase procedure and return the faulty address */ + *PageError = address; + break; + } + } + } + } + else +#endif /* FLASH_BANK2_END */ + { + /* Page Erase requested on address located on bank1 */ + /* Wait for last operation to be completed */ + if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + { + /*Initialization of PageError variable*/ + *PageError = 0xFFFFFFFFU; + + /* Erase page by page to be done*/ + for(address = pEraseInit->PageAddress; + address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress); + address += FLASH_PAGE_SIZE) + { + FLASH_PageErase(address); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the PER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PER); + + if (status != HAL_OK) + { + /* In case of error, stop erase procedure and return the faulty address */ + *PageError = address; + break; + } + } + } + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Perform a mass erase or erase the specified FLASH memory pages with interrupt enabled + * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function + * must be called before. + * Call the @ref HAL_FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation) + * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* If procedure already ongoing, reject the next one */ + if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + +#if defined(FLASH_BANK2_END) + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP_BANK2 | FLASH_IT_ERR_BANK2); + +#endif + if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; + FLASH_MassErase(pEraseInit->Banks); + } + else + { + /* Erase by page to be done*/ + + /* Check the parameters */ + assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress)); + assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + + pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE; + pFlash.DataRemaining = pEraseInit->NbPages; + pFlash.Address = pEraseInit->PageAddress; + + /*Erase 1st page and wait for IT*/ + FLASH_PageErase(pEraseInit->PageAddress); + } + + return status; +} + +/** + * @} + */ + +/** @defgroup FLASHEx_Exported_Functions_Group2 Option Bytes Programming functions + * @brief Option Bytes Programming functions + * +@verbatim + ============================================================================== + ##### Option Bytes Programming functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the FLASH + option bytes operations. + +@endverbatim + * @{ + */ + +/** + * @brief Erases the FLASH option bytes. + * @note This functions erases all option bytes except the Read protection (RDP). + * The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes + * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes + * (system reset will occur) + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_FLASHEx_OBErase(void) +{ + uint8_t rdptmp = OB_RDP_LEVEL_0; + HAL_StatusTypeDef status = HAL_ERROR; + + /* Get the actual read protection Option Byte value */ + rdptmp = FLASH_OB_GetRDP(); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* If the previous operation is completed, proceed to erase the option bytes */ + SET_BIT(FLASH->CR, FLASH_CR_OPTER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the OPTER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER); + + if(status == HAL_OK) + { + /* Restore the last read protection Option Byte value */ + status = FLASH_OB_RDP_LevelConfig(rdptmp); + } + } + + /* Return the erase status */ + return status; +} + +/** + * @brief Program option bytes + * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes + * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes + * (system reset will occur) + * + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval HAL_StatusTypeDef 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 page */ + status = FLASH_OB_EnableWRP(pOBInit->WRPPage); + } + else + { + /* Disable of Write protection on the selected page */ + status = FLASH_OB_DisableWRP(pOBInit->WRPPage); + } + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* Read protection configuration */ + if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) + { + status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* USER configuration */ + if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) + { + status = FLASH_OB_UserConfig(pOBInit->USERConfig); + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* DATA configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA) + { + status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData); + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* 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; + + /*Get WRP*/ + pOBInit->WRPPage = FLASH_OB_GetWRP(); + + /*Get RDP Level*/ + pOBInit->RDPLevel = FLASH_OB_GetRDP(); + + /*Get USER*/ + pOBInit->USERConfig = FLASH_OB_GetUser(); +} + +/** + * @brief Get the Option byte user data + * @param DATAAdress Address of the option byte DATA + * This parameter can be one of the following values: + * @arg @ref OB_DATA_ADDRESS_DATA0 + * @arg @ref OB_DATA_ADDRESS_DATA1 + * @retval Value programmed in USER data + */ +uint32_t HAL_FLASHEx_OBGetUserData(uint32_t DATAAdress) +{ + uint32_t value = 0; + + if (DATAAdress == OB_DATA_ADDRESS_DATA0) + { + /* Get value programmed in OB USER Data0 */ + value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA0) >> FLASH_POSITION_OB_USERDATA0_BIT; + } + else + { + /* Get value programmed in OB USER Data1 */ + value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA1) >> FLASH_POSITION_OB_USERDATA1_BIT; + } + + return value; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup FLASHEx_Private_Functions + * @{ + */ + +/** + * @brief Full erase of FLASH memory Bank + * @param Banks Banks to be erased + * This parameter can be one of the following values: + * @arg @ref FLASH_BANK_1 Bank1 to be erased + @if STM32F101xG + * @arg @ref FLASH_BANK_2 Bank2 to be erased + * @arg @ref FLASH_BANK_BOTH Bank1 and Bank2 to be erased + @endif + @if STM32F103xG + * @arg @ref FLASH_BANK_2 Bank2 to be erased + * @arg @ref FLASH_BANK_BOTH Bank1 and Bank2 to be erased + @endif + * + * @retval None + */ +static void FLASH_MassErase(uint32_t Banks) +{ + /* Check the parameters */ + assert_param(IS_FLASH_BANK(Banks)); + + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + +#if defined(FLASH_BANK2_END) + if(Banks == FLASH_BANK_BOTH) + { + /* bank1 & bank2 will be erased*/ + SET_BIT(FLASH->CR, FLASH_CR_MER); + SET_BIT(FLASH->CR2, FLASH_CR2_MER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); + SET_BIT(FLASH->CR2, FLASH_CR2_STRT); + } + else if(Banks == FLASH_BANK_2) + { + /*Only bank2 will be erased*/ + SET_BIT(FLASH->CR2, FLASH_CR2_MER); + SET_BIT(FLASH->CR2, FLASH_CR2_STRT); + } + else + { +#endif /* FLASH_BANK2_END */ +#if !defined(FLASH_BANK2_END) + /* Prevent unused argument(s) compilation warning */ + UNUSED(Banks); +#endif /* FLASH_BANK2_END */ + /* Only bank1 will be erased*/ + SET_BIT(FLASH->CR, FLASH_CR_MER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); +#if defined(FLASH_BANK2_END) + } +#endif /* FLASH_BANK2_END */ +} + +/** + * @brief Enable the write protection of the desired pages + * @note An option byte erase is done automatically in this function. + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash page i if + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * + * @param WriteProtectPage specifies the page(s) to be write protected. + * The value of this parameter depend on device used within the same series + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage) +{ + HAL_StatusTypeDef status = HAL_OK; + uint16_t WRP0_Data = 0xFFFF; +#if defined(FLASH_WRP1_WRP1) + uint16_t WRP1_Data = 0xFFFF; +#endif /* FLASH_WRP1_WRP1 */ +#if defined(FLASH_WRP2_WRP2) + uint16_t WRP2_Data = 0xFFFF; +#endif /* FLASH_WRP2_WRP2 */ +#if defined(FLASH_WRP3_WRP3) + uint16_t WRP3_Data = 0xFFFF; +#endif /* FLASH_WRP3_WRP3 */ + + /* Check the parameters */ + assert_param(IS_OB_WRP(WriteProtectPage)); + + /* Get current write protected pages and the new pages to be protected ******/ + WriteProtectPage = (uint32_t)(~((~FLASH_OB_GetWRP()) | WriteProtectPage)); + +#if defined(OB_WRP_PAGES0TO15MASK) + WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK); +#elif defined(OB_WRP_PAGES0TO31MASK) + WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK); +#endif /* OB_WRP_PAGES0TO31MASK */ + +#if defined(OB_WRP_PAGES16TO31MASK) + WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8U); +#elif defined(OB_WRP_PAGES32TO63MASK) + WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8U); +#endif /* OB_WRP_PAGES32TO63MASK */ + +#if defined(OB_WRP_PAGES64TO95MASK) + WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES64TO95MASK) >> 16U); +#endif /* OB_WRP_PAGES64TO95MASK */ +#if defined(OB_WRP_PAGES32TO47MASK) + WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16U); +#endif /* OB_WRP_PAGES32TO47MASK */ + +#if defined(OB_WRP_PAGES96TO127MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES96TO127MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO255MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO511MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO511MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO127MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24U); +#endif /* OB_WRP_PAGES96TO127MASK */ + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* To be able to write again option byte, need to perform a option byte erase */ + status = HAL_FLASHEx_OBErase(); + if (status == HAL_OK) + { + /* Enable write protection */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + +#if defined(FLASH_WRP0_WRP0) + if(WRP0_Data != 0xFFU) + { + OB->WRP0 &= WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP0_WRP0 */ + +#if defined(FLASH_WRP1_WRP1) + if((status == HAL_OK) && (WRP1_Data != 0xFFU)) + { + OB->WRP1 &= WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP1_WRP1 */ + +#if defined(FLASH_WRP2_WRP2) + if((status == HAL_OK) && (WRP2_Data != 0xFFU)) + { + OB->WRP2 &= WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP2_WRP2 */ + +#if defined(FLASH_WRP3_WRP3) + if((status == HAL_OK) && (WRP3_Data != 0xFFU)) + { + OB->WRP3 &= WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP3_WRP3 */ + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + } + + return status; +} + +/** + * @brief Disable the write protection of the desired pages + * @note An option byte erase is done automatically in this function. + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash page i if + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * + * @param WriteProtectPage specifies the page(s) to be write unprotected. + * The value of this parameter depend on device used within the same series + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage) +{ + HAL_StatusTypeDef status = HAL_OK; + uint16_t WRP0_Data = 0xFFFF; +#if defined(FLASH_WRP1_WRP1) + uint16_t WRP1_Data = 0xFFFF; +#endif /* FLASH_WRP1_WRP1 */ +#if defined(FLASH_WRP2_WRP2) + uint16_t WRP2_Data = 0xFFFF; +#endif /* FLASH_WRP2_WRP2 */ +#if defined(FLASH_WRP3_WRP3) + uint16_t WRP3_Data = 0xFFFF; +#endif /* FLASH_WRP3_WRP3 */ + + /* Check the parameters */ + assert_param(IS_OB_WRP(WriteProtectPage)); + + /* Get current write protected pages and the new pages to be unprotected ******/ + WriteProtectPage = (FLASH_OB_GetWRP() | WriteProtectPage); + +#if defined(OB_WRP_PAGES0TO15MASK) + WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK); +#elif defined(OB_WRP_PAGES0TO31MASK) + WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO31MASK); +#endif /* OB_WRP_PAGES0TO31MASK */ + +#if defined(OB_WRP_PAGES16TO31MASK) + WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8U); +#elif defined(OB_WRP_PAGES32TO63MASK) + WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO63MASK) >> 8U); +#endif /* OB_WRP_PAGES32TO63MASK */ + +#if defined(OB_WRP_PAGES64TO95MASK) + WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES64TO95MASK) >> 16U); +#endif /* OB_WRP_PAGES64TO95MASK */ +#if defined(OB_WRP_PAGES32TO47MASK) + WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16U); +#endif /* OB_WRP_PAGES32TO47MASK */ + +#if defined(OB_WRP_PAGES96TO127MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES96TO127MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO255MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO511MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO511MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO127MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24U); +#endif /* OB_WRP_PAGES96TO127MASK */ + + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* To be able to write again option byte, need to perform a option byte erase */ + status = HAL_FLASHEx_OBErase(); + if (status == HAL_OK) + { + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + +#if defined(FLASH_WRP0_WRP0) + if(WRP0_Data != 0xFFU) + { + OB->WRP0 |= WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP0_WRP0 */ + +#if defined(FLASH_WRP1_WRP1) + if((status == HAL_OK) && (WRP1_Data != 0xFFU)) + { + OB->WRP1 |= WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP1_WRP1 */ + +#if defined(FLASH_WRP2_WRP2) + if((status == HAL_OK) && (WRP2_Data != 0xFFU)) + { + OB->WRP2 |= WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP2_WRP2 */ + +#if defined(FLASH_WRP3_WRP3) + if((status == HAL_OK) && (WRP3_Data != 0xFFU)) + { + OB->WRP3 |= WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* FLASH_WRP3_WRP3 */ + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + } + return status; +} + +/** + * @brief Set the read protection level. + * @param ReadProtectLevel specifies the read protection level. + * This parameter can be one of the following values: + * @arg @ref OB_RDP_LEVEL_0 No protection + * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_RDP_LEVEL(ReadProtectLevel)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* If the previous operation is completed, proceed to erase the option bytes */ + SET_BIT(FLASH->CR, FLASH_CR_OPTER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the OPTER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER); + + if(status == HAL_OK) + { + /* Enable the Option Bytes Programming operation */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + + WRITE_REG(OB->RDP, ReadProtectLevel); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + } + + return status; +} + +/** + * @brief Program the FLASH User Option Byte. + * @note Programming of the OB should be performed only after an erase (otherwise PGERR occurs) + * @param UserConfig The FLASH User Option Bytes values FLASH_OBR_IWDG_SW(Bit2), + * FLASH_OBR_nRST_STOP(Bit3),FLASH_OBR_nRST_STDBY(Bit4). + * And BFBF2(Bit5) for STM32F101xG and STM32F103xG . + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE((UserConfig&OB_IWDG_SW))); + assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST))); + assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST))); +#if defined(FLASH_BANK2_END) + assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET))); +#endif /* FLASH_BANK2_END */ + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Enable the Option Bytes Programming operation */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + +#if defined(FLASH_BANK2_END) + OB->USER = (UserConfig | 0xF0U); +#else + OB->USER = (UserConfig | 0x88U); +#endif /* FLASH_BANK2_END */ + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + + return status; +} + +/** + * @brief Programs a half word at a specified Option Byte Data address. + * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes + * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes + * (system reset will occur) + * Programming of the OB should be performed only after an erase (otherwise PGERR occurs) + * @param Address specifies the address to be programmed. + * This parameter can be 0x1FFFF804 or 0x1FFFF806. + * @param Data specifies the data to be programmed. + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_OB_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Enables the Option Bytes Programming operation */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + *(__IO uint16_t*)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 OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + /* Return the Option Byte Data Program Status */ + return status; +} + +/** + * @brief Return the FLASH Write Protection Option Bytes value. + * @retval The FLASH Write Protection Option Bytes value + */ +static uint32_t FLASH_OB_GetWRP(void) +{ + /* Return the FLASH write protection Register value */ + return (uint32_t)(READ_REG(FLASH->WRPR)); +} + +/** + * @brief Returns the FLASH Read Protection level. + * @retval FLASH RDP level + * This parameter can be one of the following values: + * @arg @ref OB_RDP_LEVEL_0 No protection + * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory + */ +static uint32_t FLASH_OB_GetRDP(void) +{ + uint32_t readstatus = OB_RDP_LEVEL_0; + uint32_t tmp_reg = 0U; + + /* Read RDP level bits */ + tmp_reg = READ_BIT(FLASH->OBR, FLASH_OBR_RDPRT); + + if (tmp_reg == FLASH_OBR_RDPRT) + { + readstatus = OB_RDP_LEVEL_1; + } + else + { + readstatus = OB_RDP_LEVEL_0; + } + + return readstatus; +} + +/** + * @brief Return the FLASH User Option Byte value. + * @retval The FLASH User Option Bytes values: FLASH_OBR_IWDG_SW(Bit2), + * FLASH_OBR_nRST_STOP(Bit3),FLASH_OBR_nRST_STDBY(Bit4). + * And FLASH_OBR_BFB2(Bit5) for STM32F101xG and STM32F103xG . + */ +static uint8_t FLASH_OB_GetUser(void) +{ + /* Return the User Option Byte */ + return (uint8_t)((READ_REG(FLASH->OBR) & FLASH_OBR_USER) >> FLASH_POSITION_IWDGSW_BIT); +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup FLASH + * @{ + */ + +/** @addtogroup FLASH_Private_Functions + * @{ + */ + +/** + * @brief Erase the specified FLASH memory page + * @param PageAddress FLASH page to erase + * The value of this parameter depend on device used within the same series + * + * @retval None + */ +void FLASH_PageErase(uint32_t PageAddress) +{ + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + +#if defined(FLASH_BANK2_END) + if(PageAddress > FLASH_BANK1_END) + { + /* Proceed to erase the page */ + SET_BIT(FLASH->CR2, FLASH_CR2_PER); + WRITE_REG(FLASH->AR2, PageAddress); + SET_BIT(FLASH->CR2, FLASH_CR2_STRT); + } + else + { +#endif /* FLASH_BANK2_END */ + /* Proceed to erase the page */ + SET_BIT(FLASH->CR, FLASH_CR_PER); + WRITE_REG(FLASH->AR, PageAddress); + SET_BIT(FLASH->CR, FLASH_CR_STRT); +#if defined(FLASH_BANK2_END) + } +#endif /* FLASH_BANK2_END */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ +/** + * @} + */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c new file mode 100644 index 0000000..9fc5944 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c @@ -0,0 +1,586 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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) 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 + ============================================================================== + ##### 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 20 edge detectors in connectivity + line devices, or 19 edge detectors in other devices for generating event/interrupt requests. + Each input line can be independently configured to select the type (event or interrupt) and + the corresponding trigger event (rising or falling or both). Each line can also masked + independently. A pending register maintains the status line of the interrupt requests + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable the GPIO APB2 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 + (++) 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 PD0 and PD1, respectively, when the HSE oscillator is off. + The HSE has priority over the GPIO function. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_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_MODE 0x00000003u +#define EXTI_MODE 0x10000000u +#define GPIO_MODE_IT 0x00010000u +#define GPIO_MODE_EVT 0x00020000u +#define RISING_EDGE 0x00100000u +#define FALLING_EDGE 0x00200000u +#define GPIO_OUTPUT_TYPE 0x00000010u + +#define GPIO_NUMBER 16u + +/* Definitions for bit manipulation of CRL and CRH register */ +#define GPIO_CR_MODE_INPUT 0x00000000u /*!< 00: Input mode (reset state) */ +#define GPIO_CR_CNF_ANALOG 0x00000000u /*!< 00: Analog mode */ +#define GPIO_CR_CNF_INPUT_FLOATING 0x00000004u /*!< 01: Floating input (reset state) */ +#define GPIO_CR_CNF_INPUT_PU_PD 0x00000008u /*!< 10: Input with pull-up / pull-down */ +#define GPIO_CR_CNF_GP_OUTPUT_PP 0x00000000u /*!< 00: General purpose output push-pull */ +#define GPIO_CR_CNF_GP_OUTPUT_OD 0x00000004u /*!< 01: General purpose output Open-drain */ +#define GPIO_CR_CNF_AF_OUTPUT_PP 0x00000008u /*!< 10: Alternate function output Push-pull */ +#define GPIO_CR_CNF_AF_OUTPUT_OD 0x0000000Cu /*!< 11: Alternate function output Open-drain */ + +/** + * @} + */ +/* 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..G depending on device used) to select the GPIO peripheral + * @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 = 0x00u; + uint32_t ioposition; + uint32_t iocurrent; + uint32_t temp; + uint32_t config = 0x00u; + __IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */ + uint32_t registeroffset; /* offset used during computation of CNF and MODE bits placement inside CRL or CRH register */ + + /* 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 */ + while (((GPIO_Init->Pin) >> position) != 0x00u) + { + /* Get the IO position */ + ioposition = (0x01uL << position); + + /* Get the current IO position */ + iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; + + if (iocurrent == ioposition) + { + /* Check the Alternate function parameters */ + assert_param(IS_GPIO_AF_INSTANCE(GPIOx)); + + /* Based on the required mode, filling config variable with MODEy[1:0] and CNFy[3:2] corresponding bits */ + switch (GPIO_Init->Mode) + { + /* If we are configuring the pin in OUTPUT push-pull mode */ + case GPIO_MODE_OUTPUT_PP: + /* Check the GPIO speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_PP; + break; + + /* If we are configuring the pin in OUTPUT open-drain mode */ + case GPIO_MODE_OUTPUT_OD: + /* Check the GPIO speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + config = GPIO_Init->Speed + GPIO_CR_CNF_GP_OUTPUT_OD; + break; + + /* If we are configuring the pin in ALTERNATE FUNCTION push-pull mode */ + case GPIO_MODE_AF_PP: + /* Check the GPIO speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_PP; + break; + + /* If we are configuring the pin in ALTERNATE FUNCTION open-drain mode */ + case GPIO_MODE_AF_OD: + /* Check the GPIO speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + config = GPIO_Init->Speed + GPIO_CR_CNF_AF_OUTPUT_OD; + break; + + /* If we are configuring the pin in INPUT (also applicable to EVENT and IT mode) */ + case GPIO_MODE_INPUT: + case GPIO_MODE_IT_RISING: + case GPIO_MODE_IT_FALLING: + case GPIO_MODE_IT_RISING_FALLING: + case GPIO_MODE_EVT_RISING: + case GPIO_MODE_EVT_FALLING: + case GPIO_MODE_EVT_RISING_FALLING: + /* Check the GPIO pull parameter */ + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + if (GPIO_Init->Pull == GPIO_NOPULL) + { + config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_FLOATING; + } + else if (GPIO_Init->Pull == GPIO_PULLUP) + { + config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD; + + /* Set the corresponding ODR bit */ + GPIOx->BSRR = ioposition; + } + else /* GPIO_PULLDOWN */ + { + config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_INPUT_PU_PD; + + /* Reset the corresponding ODR bit */ + GPIOx->BRR = ioposition; + } + break; + + /* If we are configuring the pin in INPUT analog mode */ + case GPIO_MODE_ANALOG: + config = GPIO_CR_MODE_INPUT + GPIO_CR_CNF_ANALOG; + break; + + /* Parameters are checked with assert_param */ + default: + break; + } + + /* Check if the current bit belongs to first half or last half of the pin count number + in order to address CRH or CRL register*/ + configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL : &GPIOx->CRH; + registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2u) : ((position - 8u) << 2u); + + /* Apply the new configuration of the pin to the register */ + MODIFY_REG((*configregister), ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset), (config << registeroffset)); + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if ((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) + { + /* Enable AFIO Clock */ + __HAL_RCC_AFIO_CLK_ENABLE(); + temp = AFIO->EXTICR[position >> 2u]; + CLEAR_BIT(temp, (0x0Fu) << (4u * (position & 0x03u))); + SET_BIT(temp, (GPIO_GET_INDEX(GPIOx)) << (4u * (position & 0x03u))); + AFIO->EXTICR[position >> 2u] = temp; + + + /* Enable or disable the rising trigger */ + if ((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE) + { + SET_BIT(EXTI->RTSR, iocurrent); + } + else + { + CLEAR_BIT(EXTI->RTSR, iocurrent); + } + + /* Enable or disable the falling trigger */ + if ((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE) + { + SET_BIT(EXTI->FTSR, iocurrent); + } + else + { + CLEAR_BIT(EXTI->FTSR, iocurrent); + } + + /* Configure the event mask */ + if ((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT) + { + SET_BIT(EXTI->EMR, iocurrent); + } + else + { + CLEAR_BIT(EXTI->EMR, iocurrent); + } + + /* Configure the interrupt mask */ + if ((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT) + { + SET_BIT(EXTI->IMR, iocurrent); + } + else + { + CLEAR_BIT(EXTI->IMR, iocurrent); + } + } + } + + position++; + } +} + +/** + * @brief De-initializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral + * @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 = 0x00u; + uint32_t iocurrent; + uint32_t tmp; + __IO uint32_t *configregister; /* Store the address of CRL or CRH register based on pin number */ + uint32_t registeroffset; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Configure the port pins */ + while ((GPIO_Pin >> position) != 0u) + { + /* Get current io position */ + iocurrent = (GPIO_Pin) & (1uL << position); + + if (iocurrent) + { + /*------------------------- EXTI Mode Configuration --------------------*/ + /* Clear the External Interrupt or Event for the current IO */ + + tmp = AFIO->EXTICR[position >> 2u]; + tmp &= 0x0FuL << (4u * (position & 0x03u)); + if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + { + /* Clear EXTI line configuration */ + CLEAR_BIT(EXTI->IMR, (uint32_t)iocurrent); + CLEAR_BIT(EXTI->EMR, (uint32_t)iocurrent); + + /* Clear Rising Falling edge configuration */ + CLEAR_BIT(EXTI->FTSR, (uint32_t)iocurrent); + CLEAR_BIT(EXTI->RTSR, (uint32_t)iocurrent); + + tmp = 0x0FuL << (4u * (position & 0x03u)); + CLEAR_BIT(AFIO->EXTICR[position >> 2u], tmp); + } + /*------------------------- GPIO Mode Configuration --------------------*/ + /* Check if the current bit belongs to first half or last half of the pin count number + in order to address CRH or CRL register */ + configregister = (iocurrent < GPIO_PIN_8) ? &GPIOx->CRL : &GPIOx->CRH; + registeroffset = (iocurrent < GPIO_PIN_8) ? (position << 2u) : ((position - 8u) << 2u); + + /* CRL/CRH default value is floating input(0x04) shifted to correct position */ + MODIFY_REG(*configregister, ((GPIO_CRL_MODE0 | GPIO_CRL_CNF0) << registeroffset), GPIO_CRL_CNF0_0 << registeroffset); + + /* ODR default value is 0 */ + CLEAR_BIT(GPIOx->ODR, iocurrent); + } + + position++; + } +} + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions + * @brief GPIO Read and Write + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the GPIOs. + +@endverbatim + * @{ + */ + +/** + * @brief Reads the specified input port pin. + * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral + * @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..G depending on device used) to select the GPIO peripheral + * @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 pin + * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral + * @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 locking mechanism allows the IO configuration to be frozen. When the LOCK sequence +* has been applied on a port bit, it is no longer possible to modify the value of the port bit until +* the next reset. +* @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral +* @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_LOCK_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Apply lock key write sequence */ + SET_BIT(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 LCKK register. This read is mandatory to complete key lock sequence */ + tmp = GPIOx->LCKR; + + /* read again in order to confirm lock is active */ + if ((uint32_t)(GPIOx->LCKR & GPIO_LCKR_LCKK)) + { + 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) != 0x00u) + { + __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/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c new file mode 100644 index 0000000..db07359 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c @@ -0,0 +1,126 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_gpio_ex.c + * @author MCD Application Team + * @brief GPIO Extension HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the General Purpose Input/Output (GPIO) extension peripheral. + * + Extended 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 + ============================================================================== + ##### GPIO Peripheral extension features ##### + ============================================================================== + [..] GPIO module on STM32F1 family, manage also the AFIO register: + (+) Possibility to use the EVENTOUT Cortex feature + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to use EVENTOUT Cortex feature + (#) Configure EVENTOUT Cortex feature using the function HAL_GPIOEx_ConfigEventout() + (#) Activate EVENTOUT Cortex feature using the HAL_GPIOEx_EnableEventout() + (#) Deactivate EVENTOUT Cortex feature using the HAL_GPIOEx_DisableEventout() + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIOEx GPIOEx + * @brief GPIO HAL module driver + * @{ + */ + +#ifdef HAL_GPIO_MODULE_ENABLED + +/** @defgroup GPIOEx_Exported_Functions GPIOEx Exported Functions + * @{ + */ + +/** @defgroup GPIOEx_Exported_Functions_Group1 Extended features functions + * @brief Extended features functions + * +@verbatim + ============================================================================== + ##### Extended features functions ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) Configure EVENTOUT Cortex feature using the function HAL_GPIOEx_ConfigEventout() + (+) Activate EVENTOUT Cortex feature using the HAL_GPIOEx_EnableEventout() + (+) Deactivate EVENTOUT Cortex feature using the HAL_GPIOEx_DisableEventout() + +@endverbatim + * @{ + */ + +/** + * @brief Configures the port and pin on which the EVENTOUT Cortex signal will be connected. + * @param GPIO_PortSource Select the port used to output the Cortex EVENTOUT signal. + * This parameter can be a value of @ref GPIOEx_EVENTOUT_PORT. + * @param GPIO_PinSource Select the pin used to output the Cortex EVENTOUT signal. + * This parameter can be a value of @ref GPIOEx_EVENTOUT_PIN. + * @retval None + */ +void HAL_GPIOEx_ConfigEventout(uint32_t GPIO_PortSource, uint32_t GPIO_PinSource) +{ + /* Verify the parameters */ + assert_param(IS_AFIO_EVENTOUT_PORT(GPIO_PortSource)); + assert_param(IS_AFIO_EVENTOUT_PIN(GPIO_PinSource)); + + /* Apply the new configuration */ + MODIFY_REG(AFIO->EVCR, (AFIO_EVCR_PORT) | (AFIO_EVCR_PIN), (GPIO_PortSource) | (GPIO_PinSource)); +} + +/** + * @brief Enables the Event Output. + * @retval None + */ +void HAL_GPIOEx_EnableEventout(void) +{ + SET_BIT(AFIO->EVCR, AFIO_EVCR_EVOE); +} + +/** + * @brief Disables the Event Output. + * @retval None + */ +void HAL_GPIOEx_DisableEventout(void) +{ + CLEAR_BIT(AFIO->EVCR, AFIO_EVCR_EVOE); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_GPIO_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c new file mode 100644 index 0000000..6a89738 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c @@ -0,0 +1,2720 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_pcd.c + * @author MCD Application Team + * @brief PCD HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + 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 PCD HAL driver can be used as follows: + + (#) Declare a PCD_HandleTypeDef handle structure, for example: + PCD_HandleTypeDef hpcd; + + (#) Fill parameters of Init structure in HCD handle + + (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...) + + (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API: + (##) Enable the PCD/USB Low Level interface clock using + (+++) __HAL_RCC_USB_CLK_ENABLE(); For USB Device FS peripheral + (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + + (##) Initialize the related GPIO clocks + (##) Configure PCD pin-out + (##) Configure PCD NVIC interrupt + + (#)Associate the Upper USB device stack to the HAL PCD Driver: + (##) hpcd.pData = pdev; + + (#)Enable PCD transmission and reception: + (##) HAL_PCD_Start(); + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup PCD PCD + * @brief PCD HAL module driver + * @{ + */ + +#ifdef HAL_PCD_MODULE_ENABLED + +#if defined (USB) || defined (USB_OTG_FS) + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PCD_Private_Macros PCD Private Macros + * @{ + */ +#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b)) +/** + * @} + */ + +/* Private functions prototypes ----------------------------------------------*/ +/** @defgroup PCD_Private_Functions PCD Private Functions + * @{ + */ +#if defined (USB_OTG_FS) +static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum); +static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); +static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum); +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd); +#if (USE_USB_DOUBLE_BUFFER == 1U) +static HAL_StatusTypeDef HAL_PCD_EP_DB_Transmit(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal); +static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal); +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ +#endif /* defined (USB) */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PCD_Exported_Functions PCD Exported Functions + * @{ + */ + +/** @defgroup PCD_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: + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the PCD according to the specified + * parameters in the PCD_InitTypeDef and initialize the associated handle. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) +{ + uint8_t i; + + /* Check the PCD handle allocation */ + if (hpcd == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + + if (hpcd->State == HAL_PCD_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + hpcd->Lock = HAL_UNLOCKED; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SOFCallback = HAL_PCD_SOFCallback; + hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; + hpcd->ResetCallback = HAL_PCD_ResetCallback; + hpcd->SuspendCallback = HAL_PCD_SuspendCallback; + hpcd->ResumeCallback = HAL_PCD_ResumeCallback; + hpcd->ConnectCallback = HAL_PCD_ConnectCallback; + hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; + hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; + hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; + hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; + hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; + + if (hpcd->MspInitCallback == NULL) + { + hpcd->MspInitCallback = HAL_PCD_MspInit; + } + + /* Init the low level hardware */ + hpcd->MspInitCallback(hpcd); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_PCD_MspInit(hpcd); +#endif /* (USE_HAL_PCD_REGISTER_CALLBACKS) */ + } + + hpcd->State = HAL_PCD_STATE_BUSY; + + /* Disable DMA mode for FS instance */ + hpcd->Init.dma_enable = 0U; + + /* Disable the Interrupts */ + __HAL_PCD_DISABLE(hpcd); + + /*Init the Core (common init.) */ + if (USB_CoreInit(hpcd->Instance, hpcd->Init) != HAL_OK) + { + hpcd->State = HAL_PCD_STATE_ERROR; + return HAL_ERROR; + } + + /* Force Device Mode */ + if (USB_SetCurrentMode(hpcd->Instance, USB_DEVICE_MODE) != HAL_OK) + { + hpcd->State = HAL_PCD_STATE_ERROR; + return HAL_ERROR; + } + + /* Init endpoints structures */ + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + /* Init ep structure */ + hpcd->IN_ep[i].is_in = 1U; + hpcd->IN_ep[i].num = i; +#if defined (USB_OTG_FS) + hpcd->IN_ep[i].tx_fifo_num = i; +#endif /* defined (USB_OTG_FS) */ + /* Control until ep is activated */ + hpcd->IN_ep[i].type = EP_TYPE_CTRL; + hpcd->IN_ep[i].maxpacket = 0U; + hpcd->IN_ep[i].xfer_buff = 0U; + hpcd->IN_ep[i].xfer_len = 0U; + } + + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + hpcd->OUT_ep[i].is_in = 0U; + hpcd->OUT_ep[i].num = i; + /* Control until ep is activated */ + hpcd->OUT_ep[i].type = EP_TYPE_CTRL; + hpcd->OUT_ep[i].maxpacket = 0U; + hpcd->OUT_ep[i].xfer_buff = 0U; + hpcd->OUT_ep[i].xfer_len = 0U; + } + + /* Init Device */ + if (USB_DevInit(hpcd->Instance, hpcd->Init) != HAL_OK) + { + hpcd->State = HAL_PCD_STATE_ERROR; + return HAL_ERROR; + } + + hpcd->USB_Address = 0U; + hpcd->State = HAL_PCD_STATE_READY; + (void)USB_DevDisconnect(hpcd->Instance); + + return HAL_OK; +} + +/** + * @brief DeInitializes the PCD peripheral. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd) +{ + /* Check the PCD handle allocation */ + if (hpcd == NULL) + { + return HAL_ERROR; + } + + hpcd->State = HAL_PCD_STATE_BUSY; + + /* Stop Device */ + if (USB_StopDevice(hpcd->Instance) != HAL_OK) + { + return HAL_ERROR; + } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + if (hpcd->MspDeInitCallback == NULL) + { + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware */ + hpcd->MspDeInitCallback(hpcd); +#else + /* DeInit the low level hardware: CLOCK, NVIC.*/ + HAL_PCD_MspDeInit(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + hpcd->State = HAL_PCD_STATE_RESET; + + return HAL_OK; +} + +/** + * @brief Initializes the PCD MSP. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes PCD MSP. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_MspDeInit could be implemented in the user file + */ +} + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +/** + * @brief Register a User USB PCD Callback + * To be used instead of the weak predefined callback + * @param hpcd USB PCD handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID + * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID + * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID + * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID + * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID + * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID + * @arg @ref HAL_PCD_DISCONNECT_CB_ID USB PCD Disconnect callback ID + * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterCallback(PCD_HandleTypeDef *hpcd, + HAL_PCD_CallbackIDTypeDef CallbackID, + pPCD_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_PCD_SOF_CB_ID : + hpcd->SOFCallback = pCallback; + break; + + case HAL_PCD_SETUPSTAGE_CB_ID : + hpcd->SetupStageCallback = pCallback; + break; + + case HAL_PCD_RESET_CB_ID : + hpcd->ResetCallback = pCallback; + break; + + case HAL_PCD_SUSPEND_CB_ID : + hpcd->SuspendCallback = pCallback; + break; + + case HAL_PCD_RESUME_CB_ID : + hpcd->ResumeCallback = pCallback; + break; + + case HAL_PCD_CONNECT_CB_ID : + hpcd->ConnectCallback = pCallback; + break; + + case HAL_PCD_DISCONNECT_CB_ID : + hpcd->DisconnectCallback = pCallback; + break; + + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = pCallback; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hpcd->State == HAL_PCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = pCallback; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + return status; +} + +/** + * @brief Unregister an USB PCD Callback + * USB PCD callback is redirected to the weak predefined callback + * @param hpcd USB PCD handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_PCD_SOF_CB_ID USB PCD SOF callback ID + * @arg @ref HAL_PCD_SETUPSTAGE_CB_ID USB PCD Setup callback ID + * @arg @ref HAL_PCD_RESET_CB_ID USB PCD Reset callback ID + * @arg @ref HAL_PCD_SUSPEND_CB_ID USB PCD Suspend callback ID + * @arg @ref HAL_PCD_RESUME_CB_ID USB PCD Resume callback ID + * @arg @ref HAL_PCD_CONNECT_CB_ID USB PCD Connect callback ID + * @arg @ref HAL_PCD_DISCONNECT_CB_ID USB PCD Disconnect callback ID + * @arg @ref HAL_PCD_MSPINIT_CB_ID MspDeInit callback ID + * @arg @ref HAL_PCD_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterCallback(PCD_HandleTypeDef *hpcd, HAL_PCD_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + /* Setup Legacy weak Callbacks */ + if (hpcd->State == HAL_PCD_STATE_READY) + { + switch (CallbackID) + { + case HAL_PCD_SOF_CB_ID : + hpcd->SOFCallback = HAL_PCD_SOFCallback; + break; + + case HAL_PCD_SETUPSTAGE_CB_ID : + hpcd->SetupStageCallback = HAL_PCD_SetupStageCallback; + break; + + case HAL_PCD_RESET_CB_ID : + hpcd->ResetCallback = HAL_PCD_ResetCallback; + break; + + case HAL_PCD_SUSPEND_CB_ID : + hpcd->SuspendCallback = HAL_PCD_SuspendCallback; + break; + + case HAL_PCD_RESUME_CB_ID : + hpcd->ResumeCallback = HAL_PCD_ResumeCallback; + break; + + case HAL_PCD_CONNECT_CB_ID : + hpcd->ConnectCallback = HAL_PCD_ConnectCallback; + break; + + case HAL_PCD_DISCONNECT_CB_ID : + hpcd->DisconnectCallback = HAL_PCD_DisconnectCallback; + break; + + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = HAL_PCD_MspInit; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hpcd->State == HAL_PCD_STATE_RESET) + { + switch (CallbackID) + { + case HAL_PCD_MSPINIT_CB_ID : + hpcd->MspInitCallback = HAL_PCD_MspInit; + break; + + case HAL_PCD_MSPDEINIT_CB_ID : + hpcd->MspDeInitCallback = HAL_PCD_MspDeInit; + break; + + default : + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + return status; +} + +/** + * @brief Register USB PCD Data OUT Stage Callback + * To be used instead of the weak HAL_PCD_DataOutStageCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Data OUT Stage Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd, + pPCD_DataOutStageCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataOutStageCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Data OUT Stage Callback + * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataOutStageCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterDataOutStageCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataOutStageCallback = HAL_PCD_DataOutStageCallback; /* Legacy weak DataOutStageCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Data IN Stage Callback + * To be used instead of the weak HAL_PCD_DataInStageCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Data IN Stage Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterDataInStageCallback(PCD_HandleTypeDef *hpcd, + pPCD_DataInStageCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataInStageCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Data IN Stage Callback + * USB PCD Data OUT Stage Callback is redirected to the weak HAL_PCD_DataInStageCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterDataInStageCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->DataInStageCallback = HAL_PCD_DataInStageCallback; /* Legacy weak DataInStageCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Iso OUT incomplete Callback + * To be used instead of the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Iso OUT incomplete Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd, + pPCD_IsoOutIncpltCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOOUTIncompleteCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Iso OUT incomplete Callback + * USB PCD Iso OUT incomplete Callback is redirected + * to the weak HAL_PCD_ISOOUTIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoOutIncpltCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOOUTIncompleteCallback = HAL_PCD_ISOOUTIncompleteCallback; /* Legacy weak ISOOUTIncompleteCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Register USB PCD Iso IN incomplete Callback + * To be used instead of the weak HAL_PCD_ISOINIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @param pCallback pointer to the USB PCD Iso IN incomplete Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_RegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd, + pPCD_IsoInIncpltCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOINIncompleteCallback = pCallback; + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +/** + * @brief Unregister the USB PCD Iso IN incomplete Callback + * USB PCD Iso IN incomplete Callback is redirected + * to the weak HAL_PCD_ISOINIncompleteCallback() predefined callback + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_UnRegisterIsoInIncpltCallback(PCD_HandleTypeDef *hpcd) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hpcd); + + if (hpcd->State == HAL_PCD_STATE_READY) + { + hpcd->ISOINIncompleteCallback = HAL_PCD_ISOINIncompleteCallback; /* Legacy weak ISOINIncompleteCallback */ + } + else + { + /* Update the error code */ + hpcd->ErrorCode |= HAL_PCD_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hpcd); + + return status; +} + +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup PCD_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 PCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Start the USB device + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + __HAL_PCD_ENABLE(hpcd); + +#if defined (USB) + HAL_PCDEx_SetConnectionState(hpcd, 1U); +#endif /* defined (USB) */ + + (void)USB_DevConnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Stop the USB device. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + __HAL_PCD_DISABLE(hpcd); + +#if defined (USB) + HAL_PCDEx_SetConnectionState(hpcd, 0U); +#endif /* defined (USB) */ + + (void)USB_DevDisconnect(hpcd->Instance); + +#if defined (USB_OTG_FS) + (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); +#endif /* defined (USB_OTG_FS) */ + + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +#if defined (USB_OTG_FS) +/** + * @brief Handles PCD interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + USB_OTG_EPTypeDef *ep; + uint32_t i; + uint32_t ep_intr; + uint32_t epint; + uint32_t epnum; + uint32_t fifoemptymsk; + uint32_t RegVal; + + /* ensure that we are in device mode */ + if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE) + { + /* avoid spurious interrupt */ + if (__HAL_PCD_IS_INVALID_INTERRUPT(hpcd)) + { + return; + } + + /* store current frame number */ + hpcd->FrameNumber = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF_Msk) >> USB_OTG_DSTS_FNSOF_Pos; + + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS)) + { + /* incorrect mode, acknowledge the interrupt */ + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); + } + + /* Handle RxQLevel Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) + { + USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + + RegVal = USBx->GRXSTSP; + + ep = &hpcd->OUT_ep[RegVal & USB_OTG_GRXSTSP_EPNUM]; + + if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) + { + if ((RegVal & USB_OTG_GRXSTSP_BCNT) != 0U) + { + (void)USB_ReadPacket(USBx, ep->xfer_buff, + (uint16_t)((RegVal & USB_OTG_GRXSTSP_BCNT) >> 4)); + + ep->xfer_buff += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; + ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; + } + } + else if (((RegVal & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) + { + (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); + ep->xfer_count += (RegVal & USB_OTG_GRXSTSP_BCNT) >> 4; + } + else + { + /* ... */ + } + + USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + } + + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) + { + epnum = 0U; + + /* Read in the device interrupt bits */ + ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance); + + while (ep_intr != 0U) + { + if ((ep_intr & 0x1U) != 0U) + { + epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, (uint8_t)epnum); + + if ((epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC); + (void)PCD_EP_OutXfrComplete_int(hpcd, epnum); + } + + if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); + /* Class B setup phase done for previous decoded setup */ + (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); + } + + if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS); + } + + /* Clear OUT Endpoint disable interrupt */ + if ((epint & USB_OTG_DOEPINT_EPDISD) == USB_OTG_DOEPINT_EPDISD) + { + if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == USB_OTG_GINTSTS_BOUTNAKEFF) + { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGONAK; + } + + ep = &hpcd->OUT_ep[epnum]; + + if (ep->is_iso_incomplete == 1U) + { + ep->is_iso_incomplete = 0U; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_EPDISD); + } + + /* Clear Status Phase Received interrupt */ + if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); + } + + /* Clear OUT NAK interrupt */ + if ((epint & USB_OTG_DOEPINT_NAK) == USB_OTG_DOEPINT_NAK) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_NAK); + } + } + epnum++; + ep_intr >>= 1U; + } + } + + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT)) + { + /* Read in the device interrupt bits */ + ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance); + + epnum = 0U; + + while (ep_intr != 0U) + { + if ((ep_intr & 0x1U) != 0U) /* In ITR */ + { + epint = USB_ReadDevInEPInterrupt(hpcd->Instance, (uint8_t)epnum); + + if ((epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) + { + fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); + USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; + + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC); + } + if ((epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE); + } + if ((epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE) + { + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE); + } + if ((epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD) + { + (void)USB_FlushTxFifo(USBx, epnum); + + ep = &hpcd->IN_ep[epnum]; + + if (ep->is_iso_incomplete == 1U) + { + ep->is_iso_incomplete = 0U; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_ISOINIncompleteCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD); + } + if ((epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE) + { + (void)PCD_WriteEmptyTxFifo(hpcd, epnum); + } + } + epnum++; + ep_intr >>= 1U; + } + } + + /* Handle Resume Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT)) + { + /* Clear the Remote Wake-up Signaling */ + USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ResumeCallback(hpcd); +#else + HAL_PCD_ResumeCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT); + } + + /* Handle Suspend Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP)) + { + if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SuspendCallback(hpcd); +#else + HAL_PCD_SuspendCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP); + } + /* Handle Reset Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST)) + { + USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; + (void)USB_FlushTxFifo(hpcd->Instance, 0x10U); + + for (i = 0U; i < hpcd->Init.dev_endpoints; i++) + { + USBx_INEP(i)->DIEPINT = 0xFB7FU; + USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + USBx_OUTEP(i)->DOEPINT = 0xFB7FU; + USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + } + USBx_DEVICE->DAINTMSK |= 0x10001U; + + if (hpcd->Init.use_dedicated_ep1 != 0U) + { + USBx_DEVICE->DOUTEP1MSK |= USB_OTG_DOEPMSK_STUPM | + USB_OTG_DOEPMSK_XFRCM | + USB_OTG_DOEPMSK_EPDM; + + USBx_DEVICE->DINEP1MSK |= USB_OTG_DIEPMSK_TOM | + USB_OTG_DIEPMSK_XFRCM | + USB_OTG_DIEPMSK_EPDM; + } + else + { + USBx_DEVICE->DOEPMSK |= USB_OTG_DOEPMSK_STUPM | + USB_OTG_DOEPMSK_XFRCM | + USB_OTG_DOEPMSK_EPDM | + USB_OTG_DOEPMSK_OTEPSPRM | + USB_OTG_DOEPMSK_NAKM; + + USBx_DEVICE->DIEPMSK |= USB_OTG_DIEPMSK_TOM | + USB_OTG_DIEPMSK_XFRCM | + USB_OTG_DIEPMSK_EPDM; + } + + /* Set Default Address to 0 */ + USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD; + + /* setup EP0 to receive SETUP packets */ + (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t *)hpcd->Setup); + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST); + } + + /* Handle Enumeration done Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE)) + { + (void)USB_ActivateSetup(hpcd->Instance); + hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance); + + /* Set USB Turnaround time */ + (void)USB_SetTurnaroundTime(hpcd->Instance, + HAL_RCC_GetHCLKFreq(), + (uint8_t)hpcd->Init.speed); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ResetCallback(hpcd); +#else + HAL_PCD_ResetCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); + } + + /* Handle SOF Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SOFCallback(hpcd); +#else + HAL_PCD_SOFCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF); + } + + /* Handle Global OUT NAK effective Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_BOUTNAKEFF)) + { + USBx->GINTMSK &= ~USB_OTG_GINTMSK_GONAKEFFM; + + for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) + { + if (hpcd->OUT_ep[epnum].is_iso_incomplete == 1U) + { + /* Abort current transaction and disable the EP */ + (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)epnum); + } + } + } + + /* Handle Incomplete ISO IN Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) + { + for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) + { + RegVal = USBx_INEP(epnum)->DIEPCTL; + + if ((hpcd->IN_ep[epnum].type == EP_TYPE_ISOC) && + ((RegVal & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA)) + { + hpcd->IN_ep[epnum].is_iso_incomplete = 1U; + + /* Abort current transaction and disable the EP */ + (void)HAL_PCD_EP_Abort(hpcd, (uint8_t)(epnum | 0x80U)); + } + } + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR); + } + + /* Handle Incomplete ISO OUT Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) + { + for (epnum = 1U; epnum < hpcd->Init.dev_endpoints; epnum++) + { + RegVal = USBx_OUTEP(epnum)->DOEPCTL; + + if ((hpcd->OUT_ep[epnum].type == EP_TYPE_ISOC) && + ((RegVal & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) && + ((RegVal & (0x1U << 16)) == (hpcd->FrameNumber & 0x1U))) + { + hpcd->OUT_ep[epnum].is_iso_incomplete = 1U; + + USBx->GINTMSK |= USB_OTG_GINTMSK_GONAKEFFM; + + if ((USBx->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0U) + { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SGONAK; + break; + } + } + } + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT); + } + + /* Handle Connection event Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT)) + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ConnectCallback(hpcd); +#else + HAL_PCD_ConnectCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT); + } + + /* Handle Disconnection event Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT)) + { + RegVal = hpcd->Instance->GOTGINT; + + if ((RegVal & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET) + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DisconnectCallback(hpcd); +#else + HAL_PCD_DisconnectCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + hpcd->Instance->GOTGINT |= RegVal; + } + } +} + + +/** + * @brief Handles PCD Wakeup interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd) +{ + /* Clear EXTI pending Bit */ + __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG(); +} +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +/** + * @brief This function handles PCD interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) +{ + uint32_t wIstr = USB_ReadInterrupts(hpcd->Instance); + uint16_t store_ep[8]; + uint8_t i; + + if ((wIstr & USB_ISTR_CTR) == USB_ISTR_CTR) + { + /* servicing of the endpoint correct transfer interrupt */ + /* clear of the CTR flag into the sub */ + (void)PCD_EP_ISR_Handler(hpcd); + + return; + } + + if ((wIstr & USB_ISTR_RESET) == USB_ISTR_RESET) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ResetCallback(hpcd); +#else + HAL_PCD_ResetCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + (void)HAL_PCD_SetAddress(hpcd, 0U); + + return; + } + + if ((wIstr & USB_ISTR_PMAOVR) == USB_ISTR_PMAOVR) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR); + + return; + } + + if ((wIstr & USB_ISTR_ERR) == USB_ISTR_ERR) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR); + + return; + } + + if ((wIstr & USB_ISTR_WKUP) == USB_ISTR_WKUP) + { + hpcd->Instance->CNTR &= (uint16_t) ~(USB_CNTR_LP_MODE); + hpcd->Instance->CNTR &= (uint16_t) ~(USB_CNTR_FSUSP); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->ResumeCallback(hpcd); +#else + HAL_PCD_ResumeCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP); + + return; + } + + if ((wIstr & USB_ISTR_SUSP) == USB_ISTR_SUSP) + { + /* WA: To Clear Wakeup flag if raised with suspend signal */ + + /* Store Endpoint registers */ + for (i = 0U; i < 8U; i++) + { + store_ep[i] = PCD_GET_ENDPOINT(hpcd->Instance, i); + } + + /* FORCE RESET */ + hpcd->Instance->CNTR |= (uint16_t)(USB_CNTR_FRES); + + /* CLEAR RESET */ + hpcd->Instance->CNTR &= (uint16_t)(~USB_CNTR_FRES); + + /* wait for reset flag in ISTR */ + while ((hpcd->Instance->ISTR & USB_ISTR_RESET) == 0U) + { + } + + /* Clear Reset Flag */ + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET); + + /* Restore Registre */ + for (i = 0U; i < 8U; i++) + { + PCD_SET_ENDPOINT(hpcd->Instance, i, store_ep[i]); + } + + /* Force low-power mode in the macrocell */ + hpcd->Instance->CNTR |= (uint16_t)USB_CNTR_FSUSP; + + /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */ + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP); + + hpcd->Instance->CNTR |= (uint16_t)USB_CNTR_LP_MODE; + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SuspendCallback(hpcd); +#else + HAL_PCD_SuspendCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + return; + } + + if ((wIstr & USB_ISTR_SOF) == USB_ISTR_SOF) + { + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF); + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SOFCallback(hpcd); +#else + HAL_PCD_SOFCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + return; + } + + if ((wIstr & USB_ISTR_ESOF) == USB_ISTR_ESOF) + { + /* clear ESOF flag in ISTR */ + __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF); + + return; + } +} + + +/** + * @brief Handles PCD Wakeup interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +void HAL_PCD_WKUP_IRQHandler(PCD_HandleTypeDef *hpcd) +{ + /* Clear EXTI pending Bit */ + __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG(); +} +#endif /* defined (USB) */ + +/** + * @brief Data OUT stage callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DataOutStageCallback could be implemented in the user file + */ +} + +/** + * @brief Data IN stage callback + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DataInStageCallback could be implemented in the user file + */ +} +/** + * @brief Setup stage callback + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SetupStageCallback could be implemented in the user file + */ +} + +/** + * @brief USB Start Of Frame callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SOFCallback could be implemented in the user file + */ +} + +/** + * @brief USB Reset callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ResetCallback could be implemented in the user file + */ +} + +/** + * @brief Suspend event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_SuspendCallback could be implemented in the user file + */ +} + +/** + * @brief Resume event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ResumeCallback could be implemented in the user file + */ +} + +/** + * @brief Incomplete ISO OUT callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file + */ +} + +/** + * @brief Incomplete ISO IN callback. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval None + */ +__weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(epnum); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file + */ +} + +/** + * @brief Connection event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_ConnectCallback could be implemented in the user file + */ +} + +/** + * @brief Disconnection event callback. + * @param hpcd PCD handle + * @retval None + */ +__weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCD_DisconnectCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the PCD data + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Connect the USB device + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + +#if defined (USB) + HAL_PCDEx_SetConnectionState(hpcd, 1U); +#endif /* defined (USB) */ + + (void)USB_DevConnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Disconnect the USB device. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd) +{ + __HAL_LOCK(hpcd); + +#if defined (USB) + HAL_PCDEx_SetConnectionState(hpcd, 0U); +#endif /* defined (USB) */ + + (void)USB_DevDisconnect(hpcd->Instance); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Set the USB Device address. + * @param hpcd PCD handle + * @param address new device address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address) +{ + __HAL_LOCK(hpcd); + hpcd->USB_Address = address; + (void)USB_SetDevAddress(hpcd->Instance, address); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} +/** + * @brief Open and configure an endpoint. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param ep_mps endpoint max packet size + * @param ep_type endpoint type + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, + uint16_t ep_mps, uint8_t ep_type) +{ + HAL_StatusTypeDef ret = HAL_OK; + PCD_EPTypeDef *ep; + + if ((ep_addr & 0x80U) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + + ep->num = ep_addr & EP_ADDR_MSK; + ep->maxpacket = ep_mps; + ep->type = ep_type; + +#if defined (USB_OTG_FS) + if (ep->is_in != 0U) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } +#endif /* defined (USB_OTG_FS) */ + + /* Set initial data PID. */ + if (ep_type == EP_TYPE_BULK) + { + ep->data_pid_start = 0U; + } + + __HAL_LOCK(hpcd); + (void)USB_ActivateEndpoint(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + + return ret; +} + +/** + * @brief Deactivate an endpoint. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if ((ep_addr & 0x80U) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + (void)USB_DeactivateEndpoint(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + return HAL_OK; +} + + +/** + * @brief Receive an amount of data. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param pBuf pointer to the reception buffer + * @param len amount of data to be received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; + ep->xfer_count = 0U; + ep->is_in = 0U; + ep->num = ep_addr & EP_ADDR_MSK; + + (void)USB_EPStartXfer(hpcd->Instance, ep); + + return HAL_OK; +} + +/** + * @brief Get Received Data Size + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval Data Size + */ +uint32_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef const *hpcd, uint8_t ep_addr) +{ + return hpcd->OUT_ep[ep_addr & EP_ADDR_MSK].xfer_count; +} +/** + * @brief Send an amount of data + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @param pBuf pointer to the transmission buffer + * @param len amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; +#if defined (USB) + ep->xfer_fill_db = 1U; + ep->xfer_len_db = len; +#endif /* defined (USB) */ + ep->xfer_count = 0U; + ep->is_in = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + + (void)USB_EPStartXfer(hpcd->Instance, ep); + + return HAL_OK; +} + +/** + * @brief Set a STALL condition over an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if (((uint32_t)ep_addr & EP_ADDR_MSK) > hpcd->Init.dev_endpoints) + { + return HAL_ERROR; + } + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr]; + ep->is_in = 0U; + } + + ep->is_stall = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + + (void)USB_EPSetStall(hpcd->Instance, ep); + + if ((ep_addr & EP_ADDR_MSK) == 0U) + { + (void)USB_EP0_OutStart(hpcd->Instance, (uint8_t *)hpcd->Setup); + } + + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Clear a STALL condition over in an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + PCD_EPTypeDef *ep; + + if (((uint32_t)ep_addr & 0x0FU) > hpcd->Init.dev_endpoints) + { + return HAL_ERROR; + } + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 1U; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + ep->is_in = 0U; + } + + ep->is_stall = 0U; + ep->num = ep_addr & EP_ADDR_MSK; + + __HAL_LOCK(hpcd); + (void)USB_EPClearStall(hpcd->Instance, ep); + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Abort an USB EP transaction. + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + HAL_StatusTypeDef ret; + PCD_EPTypeDef *ep; + + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + } + else + { + ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK]; + } + + /* Stop Xfer */ + ret = USB_EPStopXfer(hpcd->Instance, ep); + + return ret; +} + +/** + * @brief Flush an endpoint + * @param hpcd PCD handle + * @param ep_addr endpoint address + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) +{ + __HAL_LOCK(hpcd); + + if ((ep_addr & 0x80U) == 0x80U) + { + (void)USB_FlushTxFifo(hpcd->Instance, (uint32_t)ep_addr & EP_ADDR_MSK); + } + else + { + (void)USB_FlushRxFifo(hpcd->Instance); + } + + __HAL_UNLOCK(hpcd); + + return HAL_OK; +} + +/** + * @brief Activate remote wakeup signalling + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) +{ + return (USB_ActivateRemoteWakeup(hpcd->Instance)); +} + +/** + * @brief De-activate remote wakeup signalling. + * @param hpcd PCD handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) +{ + return (USB_DeActivateRemoteWakeup(hpcd->Instance)); +} + +/** + * @} + */ + +/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions + * @brief 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 PCD handle state. + * @param hpcd PCD handle + * @retval HAL state + */ +PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef const *hpcd) +{ + return hpcd->State; +} + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup PCD_Private_Functions + * @{ + */ +#if defined (USB_OTG_FS) +/** + * @brief Check FIFO for the next packet to be loaded. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval HAL status + */ +static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum) +{ + USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + USB_OTG_EPTypeDef *ep; + uint32_t len; + uint32_t len32b; + uint32_t fifoemptymsk; + + ep = &hpcd->IN_ep[epnum]; + + if (ep->xfer_count > ep->xfer_len) + { + return HAL_ERROR; + } + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3U) / 4U; + + while (((USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b) && + (ep->xfer_count < ep->xfer_len) && (ep->xfer_len != 0U)) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3U) / 4U; + + (void)USB_WritePacket(USBx, ep->xfer_buff, (uint8_t)epnum, (uint16_t)len); + + ep->xfer_buff += len; + ep->xfer_count += len; + } + + if (ep->xfer_len <= ep->xfer_count) + { + fifoemptymsk = (uint32_t)(0x1UL << (epnum & EP_ADDR_MSK)); + USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; + } + + return HAL_OK; +} + + +/** + * @brief process EP OUT transfer complete interrupt. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval HAL status + */ +static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) +{ + const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); + uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; + + if (gSNPSiD == USB_OTG_CORE_ID_310A) + { + /* StupPktRcvd = 1 this is a setup packet */ + if ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); + } + else + { + if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); + } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + } + else + { +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + + +/** + * @brief process EP OUT setup packet received interrupt. + * @param hpcd PCD handle + * @param epnum endpoint number + * @retval HAL status + */ +static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint32_t epnum) +{ + const USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); + uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; + + if ((gSNPSiD > USB_OTG_CORE_ID_300A) && + ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) + { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); + } + + /* Inform the upper layer that a setup packet is available */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SetupStageCallback(hpcd); +#else + HAL_PCD_SetupStageCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + return HAL_OK; +} +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +/** + * @brief This function handles PCD Endpoint interrupt request. + * @param hpcd PCD handle + * @retval HAL status + */ +static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd) +{ + PCD_EPTypeDef *ep; + uint16_t count; + uint16_t wIstr; + uint16_t wEPVal; + uint16_t TxPctSize; + uint8_t epindex; + +#if (USE_USB_DOUBLE_BUFFER != 1U) + count = 0U; +#endif /* USE_USB_DOUBLE_BUFFER */ + + /* stay in loop while pending interrupts */ + while ((hpcd->Instance->ISTR & USB_ISTR_CTR) != 0U) + { + wIstr = hpcd->Instance->ISTR; + + /* extract highest priority endpoint number */ + epindex = (uint8_t)(wIstr & USB_ISTR_EP_ID); + + if (epindex == 0U) + { + /* Decode and service control endpoint interrupt */ + + /* DIR bit = origin of the interrupt */ + if ((wIstr & USB_ISTR_DIR) == 0U) + { + /* DIR = 0 */ + + /* DIR = 0 => IN int */ + /* DIR = 0 implies that (EP_CTR_TX = 1) always */ + PCD_CLEAR_TX_EP_CTR(hpcd->Instance, PCD_ENDP0); + ep = &hpcd->IN_ep[0]; + + ep->xfer_count = PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num); + ep->xfer_buff += ep->xfer_count; + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, 0U); +#else + HAL_PCD_DataInStageCallback(hpcd, 0U); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + if ((hpcd->USB_Address > 0U) && (ep->xfer_len == 0U)) + { + hpcd->Instance->DADDR = ((uint16_t)hpcd->USB_Address | USB_DADDR_EF); + hpcd->USB_Address = 0U; + } + } + else + { + /* DIR = 1 */ + + /* DIR = 1 & CTR_RX => SETUP or OUT int */ + /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */ + ep = &hpcd->OUT_ep[0]; + wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0); + + if ((wEPVal & USB_EP_SETUP) != 0U) + { + /* Get SETUP Packet */ + ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num); + + USB_ReadPMA(hpcd->Instance, (uint8_t *)hpcd->Setup, + ep->pmaadress, (uint16_t)ep->xfer_count); + + /* SETUP bit kept frozen while CTR_RX = 1 */ + PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0); + + /* Process SETUP Packet*/ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->SetupStageCallback(hpcd); +#else + HAL_PCD_SetupStageCallback(hpcd); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else if ((wEPVal & USB_EP_CTR_RX) != 0U) + { + PCD_CLEAR_RX_EP_CTR(hpcd->Instance, PCD_ENDP0); + + /* Get Control Data OUT Packet */ + ep->xfer_count = PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num); + + if ((ep->xfer_count != 0U) && (ep->xfer_buff != 0U)) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, + ep->pmaadress, (uint16_t)ep->xfer_count); + + ep->xfer_buff += ep->xfer_count; + + /* Process Control Data OUT Packet */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, 0U); +#else + HAL_PCD_DataOutStageCallback(hpcd, 0U); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + + wEPVal = (uint16_t)PCD_GET_ENDPOINT(hpcd->Instance, PCD_ENDP0); + + if (((wEPVal & USB_EP_SETUP) == 0U) && ((wEPVal & USB_EP_RX_STRX) != USB_EP_RX_VALID)) + { + PCD_SET_EP_RX_CNT(hpcd->Instance, PCD_ENDP0, ep->maxpacket); + PCD_SET_EP_RX_STATUS(hpcd->Instance, PCD_ENDP0, USB_EP_RX_VALID); + } + } + } + } + else + { + /* Decode and service non control endpoints interrupt */ + /* process related endpoint register */ + wEPVal = PCD_GET_ENDPOINT(hpcd->Instance, epindex); + + if ((wEPVal & USB_EP_CTR_RX) != 0U) + { + /* clear int flag */ + PCD_CLEAR_RX_EP_CTR(hpcd->Instance, epindex); + ep = &hpcd->OUT_ep[epindex]; + + /* OUT Single Buffering */ + if (ep->doublebuffer == 0U) + { + count = (uint16_t)PCD_GET_EP_RX_CNT(hpcd->Instance, ep->num); + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, count); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else + { + /* manage double buffer bulk out */ + if (ep->type == EP_TYPE_BULK) + { + count = HAL_PCD_EP_DB_Receive(hpcd, ep, wEPVal); + } + else /* manage double buffer iso out */ + { + /* free EP OUT Buffer */ + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U); + + if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_RX) != 0U) + { + /* read from endpoint BUF0Addr buffer */ + count = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num); + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count); + } + } + else + { + /* read from endpoint BUF1Addr buffer */ + count = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num); + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count); + } + } + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* multi-packet on the NON control OUT endpoint */ + ep->xfer_count += count; + ep->xfer_buff += count; + + if ((ep->xfer_len == 0U) || (count < ep->maxpacket)) + { + /* RX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataOutStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + (void)USB_EPStartXfer(hpcd->Instance, ep); + } + } + + if ((wEPVal & USB_EP_CTR_TX) != 0U) + { + ep = &hpcd->IN_ep[epindex]; + + /* clear int flag */ + PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex); + + if (ep->type == EP_TYPE_ISOC) + { + ep->xfer_len = 0U; + +#if (USE_USB_DOUBLE_BUFFER == 1U) + if (ep->doublebuffer != 0U) + { + if ((wEPVal & USB_EP_DTOG_TX) != 0U) + { + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + } + else + { + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + /* Manage Single Buffer Transaction */ + if ((wEPVal & USB_EP_KIND) == 0U) + { + /* multi-packet on the NON control IN endpoint */ + TxPctSize = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len > TxPctSize) + { + ep->xfer_len -= TxPctSize; + } + else + { + ep->xfer_len = 0U; + } + + /* Zero Length Packet? */ + if (ep->xfer_len == 0U) + { + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + } + else + { + /* Transfer is not yet Done */ + ep->xfer_buff += TxPctSize; + ep->xfer_count += TxPctSize; + (void)USB_EPStartXfer(hpcd->Instance, ep); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + /* Double Buffer bulk IN (bulk transfer Len > Ep_Mps) */ + else + { + (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal); + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + } + } + } + } + + return HAL_OK; +} + + +#if (USE_USB_DOUBLE_BUFFER == 1U) +/** + * @brief Manage double buffer bulk out transaction from ISR + * @param hpcd PCD handle + * @param ep current endpoint handle + * @param wEPVal Last snapshot of EPRx register value taken in ISR + * @retval HAL status + */ +static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, + PCD_EPTypeDef *ep, uint16_t wEPVal) +{ + uint16_t count; + + /* Manage Buffer0 OUT */ + if ((wEPVal & USB_EP_DTOG_RX) != 0U) + { + /* Get count of received Data on buffer0 */ + count = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len >= count) + { + ep->xfer_len -= count; + } + else + { + ep->xfer_len = 0U; + } + + if (ep->xfer_len == 0U) + { + /* set NAK to OUT endpoint since double buffer is enabled */ + PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_NAK); + } + + /* Check if Buffer1 is in blocked state which requires to toggle */ + if ((wEPVal & USB_EP_DTOG_TX) != 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U); + } + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, count); + } + } + /* Manage Buffer 1 DTOG_RX=0 */ + else + { + /* Get count of received data */ + count = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len >= count) + { + ep->xfer_len -= count; + } + else + { + ep->xfer_len = 0U; + } + + if (ep->xfer_len == 0U) + { + /* set NAK on the current endpoint */ + PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_NAK); + } + + /*Need to FreeUser Buffer*/ + if ((wEPVal & USB_EP_DTOG_TX) == 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U); + } + + if (count != 0U) + { + USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, count); + } + } + + return count; +} + + +/** + * @brief Manage double buffer bulk IN transaction from ISR + * @param hpcd PCD handle + * @param ep current endpoint handle + * @param wEPVal Last snapshot of EPRx register value taken in ISR + * @retval HAL status + */ +static HAL_StatusTypeDef HAL_PCD_EP_DB_Transmit(PCD_HandleTypeDef *hpcd, + PCD_EPTypeDef *ep, uint16_t wEPVal) +{ + uint32_t len; + uint16_t TxPctSize; + + /* Data Buffer0 ACK received */ + if ((wEPVal & USB_EP_DTOG_TX) != 0U) + { + /* multi-packet on the NON control IN endpoint */ + TxPctSize = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len > TxPctSize) + { + ep->xfer_len -= TxPctSize; + } + else + { + ep->xfer_len = 0U; + } + + /* Transfer is completed */ + if (ep->xfer_len == 0U) + { + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + if ((wEPVal & USB_EP_DTOG_RX) != 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + } + else /* Transfer is not yet Done */ + { + /* need to Free USB Buff */ + if ((wEPVal & USB_EP_DTOG_RX) != 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + + /* Still there is data to Fill in the next Buffer */ + if (ep->xfer_fill_db == 1U) + { + ep->xfer_buff += TxPctSize; + ep->xfer_count += TxPctSize; + + /* Calculate the len of the new buffer to fill */ + if (ep->xfer_len_db >= ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len_db -= len; + } + else if (ep->xfer_len_db == 0U) + { + len = TxPctSize; + ep->xfer_fill_db = 0U; + } + else + { + ep->xfer_fill_db = 0U; + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + } + + /* Write remaining Data to Buffer */ + /* Set the Double buffer counter for pma buffer1 */ + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, len); + + /* Copy user buffer to USB PMA */ + USB_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr0, (uint16_t)len); + } + } + } + else /* Data Buffer1 ACK received */ + { + /* multi-packet on the NON control IN endpoint */ + TxPctSize = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num); + + if (ep->xfer_len >= TxPctSize) + { + ep->xfer_len -= TxPctSize; + } + else + { + ep->xfer_len = 0U; + } + + /* Transfer is completed */ + if (ep->xfer_len == 0U) + { + PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U); + + /* TX COMPLETE */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, ep->num); +#else + HAL_PCD_DataInStageCallback(hpcd, ep->num); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + + /* need to Free USB Buff */ + if ((wEPVal & USB_EP_DTOG_RX) == 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + } + else /* Transfer is not yet Done */ + { + /* need to Free USB Buff */ + if ((wEPVal & USB_EP_DTOG_RX) == 0U) + { + PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U); + } + + /* Still there is data to Fill in the next Buffer */ + if (ep->xfer_fill_db == 1U) + { + ep->xfer_buff += TxPctSize; + ep->xfer_count += TxPctSize; + + /* Calculate the len of the new buffer to fill */ + if (ep->xfer_len_db >= ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len_db -= len; + } + else if (ep->xfer_len_db == 0U) + { + len = TxPctSize; + ep->xfer_fill_db = 0U; + } + else + { + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + ep->xfer_fill_db = 0; + } + + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, len); + + /* Copy the user buffer to USB PMA */ + USB_WritePMA(hpcd->Instance, ep->xfer_buff, ep->pmaaddr1, (uint16_t)len); + } + } + } + + /*enable endpoint IN*/ + PCD_SET_EP_TX_STATUS(hpcd->Instance, ep->num, USB_EP_TX_VALID); + + return HAL_OK; +} +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + +#endif /* defined (USB) */ + +/** + * @} + */ +#endif /* defined (USB) || defined (USB_OTG_FS) */ +#endif /* HAL_PCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c new file mode 100644 index 0000000..2e5a2a3 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c @@ -0,0 +1,243 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_pcd_ex.c + * @author MCD Application Team + * @brief PCD Extended HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Extended 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. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup PCDEx PCDEx + * @brief PCD Extended HAL module driver + * @{ + */ + +#ifdef HAL_PCD_MODULE_ENABLED + +#if defined (USB) || defined (USB_OTG_FS) +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup PCDEx_Exported_Functions PCDEx Exported Functions + * @{ + */ + +/** @defgroup PCDEx_Exported_Functions_Group1 Peripheral Control functions + * @brief PCDEx control functions + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Update FIFO configuration + +@endverbatim + * @{ + */ +#if defined (USB_OTG_FS) +/** + * @brief Set Tx FIFO + * @param hpcd PCD handle + * @param fifo The number of Tx fifo + * @param size Fifo size + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) +{ + uint8_t i; + uint32_t Tx_Offset; + + /* TXn min size = 16 words. (n : Transmit FIFO index) + When a TxFIFO is not used, the Configuration should be as follows: + case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txm can use the space allocated for Txn. + case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) + --> Txn should be configured with the minimum space of 16 words + The FIFO is used optimally when used TxFIFOs are allocated in the top + of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. + When DMA is used 3n * FIFO locations should be reserved for internal DMA registers */ + + Tx_Offset = hpcd->Instance->GRXFSIZ; + + if (fifo == 0U) + { + hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset; + } + else + { + Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16; + for (i = 0U; i < (fifo - 1U); i++) + { + Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16); + } + + /* Multiply Tx_Size by 2 to get higher performance */ + hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset; + } + + return HAL_OK; +} + +/** + * @brief Set Rx FIFO + * @param hpcd PCD handle + * @param size Size of Rx fifo + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size) +{ + hpcd->Instance->GRXFSIZ = size; + + return HAL_OK; +} +#endif /* defined (USB_OTG_FS) */ +#if defined (USB) +/** + * @brief Configure PMA for EP + * @param hpcd Device instance + * @param ep_addr endpoint address + * @param ep_kind endpoint Kind + * USB_SNG_BUF: Single Buffer used + * USB_DBL_BUF: Double Buffer used + * @param pmaadress: EP address in The PMA: In case of single buffer endpoint + * this parameter is 16-bit value providing the address + * in PMA allocated to endpoint. + * In case of double buffer endpoint this parameter + * is a 32-bit value providing the endpoint buffer 0 address + * in the LSB part of 32-bit value and endpoint buffer 1 address + * in the MSB part of 32-bit value. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_PCDEx_PMAConfig(PCD_HandleTypeDef *hpcd, uint16_t ep_addr, + uint16_t ep_kind, uint32_t pmaadress) +{ + PCD_EPTypeDef *ep; + + /* initialize ep structure*/ + if ((0x80U & ep_addr) == 0x80U) + { + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + } + else + { + ep = &hpcd->OUT_ep[ep_addr]; + } + + /* Here we check if the endpoint is single or double Buffer*/ + if (ep_kind == PCD_SNG_BUF) + { + /* Single Buffer */ + ep->doublebuffer = 0U; + /* Configure the PMA */ + ep->pmaadress = (uint16_t)pmaadress; + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else /* USB_DBL_BUF */ + { + /* Double Buffer Endpoint */ + ep->doublebuffer = 1U; + /* Configure the PMA */ + ep->pmaaddr0 = (uint16_t)(pmaadress & 0xFFFFU); + ep->pmaaddr1 = (uint16_t)((pmaadress & 0xFFFF0000U) >> 16); + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + return HAL_OK; +} + +/** + * @brief Software Device Connection, + * this function is not required by USB OTG FS peripheral, it is used + * only by USB Device FS peripheral. + * @param hpcd PCD handle + * @param state connection state (0 : disconnected / 1: connected) + * @retval None + */ +__weak void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(state); + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_PCDEx_SetConnectionState could be implemented in the user file + */ +} +#endif /* defined (USB) */ + +/** + * @brief Send LPM message to user layer callback. + * @param hpcd PCD handle + * @param msg LPM message + * @retval HAL status + */ +__weak void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(msg); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCDEx_LPM_Callback could be implemented in the user file + */ +} + +/** + * @brief Send BatteryCharging message to user layer callback. + * @param hpcd PCD handle + * @param msg LPM message + * @retval HAL status + */ +__weak void HAL_PCDEx_BCD_Callback(PCD_HandleTypeDef *hpcd, PCD_BCD_MsgTypeDef msg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hpcd); + UNUSED(msg); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_PCDEx_BCD_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB) || defined (USB_OTG_FS) */ +#endif /* HAL_PCD_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c new file mode 100644 index 0000000..16476de --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c @@ -0,0 +1,618 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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/de-initialization functions + * + Peripheral Control 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. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup PWR PWR + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + +/** @defgroup PWR_Private_Constants 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 +/** + * @} + */ + + +/** @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 LPSDSR bit */ +#define LPSDSR_BIT_NUMBER PWR_CR_LPDS_Pos +#define CR_LPSDSR_BB ((uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPSDSR_BIT_NUMBER * 4U))) + +/* 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))) + +/** + * @} + */ + +/** @defgroup PWR_CSR_register_alias PWR CSR Register alias address + * @{ + */ + +/* --- CSR Register ---*/ +/* Alias word address of EWUP1 bit */ +#define CSR_EWUP_BB(VAL) ((uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (POSITION_VAL(VAL) * 4U))) +/** + * @} + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup PWR_Private_Functions PWR Private Functions + * brief WFE cortex command overloaded for HAL_PWR_EnterSTOPMode usage only (see Workaround section) + * @{ + */ +static void PWR_OverloadWfe(void); + +/* Private functions ---------------------------------------------------------*/ +__NOINLINE +static void PWR_OverloadWfe(void) +{ + __asm volatile( "wfe" ); + __asm volatile( "nop" ); +} + +/** + * @} + */ + + +/** @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) 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 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 ). + * @note If the HSE divided by 128 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + /* Enable access to RTC and backup registers */ + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables access to the backup domain (RTC registers, RTC + * backup data registers). + * @note If the HSE divided by 128 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + /* Disable access to RTC and backup registers */ + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; +} + +/** + * @} + */ + +/** @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_PVD_EXTI_ENABLE_IT() macro. + (+) The PVD is stopped in Standby mode. + + *** WakeUp pin configuration *** + ================================ + [..] + (+) WakeUp 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 WakeUp pin: + WakeUp Pin 1 on PA.00. + + [..] + + *** Low Power modes configuration *** + ===================================== + [..] + The device features 3 low-power modes: + (+) Sleep mode: CPU clock off, all peripherals including Cortex-M3 core peripherals like + NVIC, SysTick, etc. are kept running + (+) Stop mode: All clocks are stopped + (+) Standby mode: 1.8V domain powered off + + + *** Sleep mode *** + ================== + [..] + (+) Entry: + The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFx) + functions with + (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + + (+) Exit: + (++) WFI entry mode, Any peripheral interrupt acknowledged by the nested vectored interrupt + controller (NVIC) can wake up the device from Sleep mode. + (++) WFE entry mode, Any wakeup event can wake up the device from Sleep mode. + (+++) Any peripheral interrupt w/o NVIC configuration & SEVONPEND bit set in the Cortex (HAL_PWR_EnableSEVOnPend) + (+++) Any EXTI Line (Internal or External) configured in Event mode + + *** Stop mode *** + ================= + [..] + The Stop mode is based on the Cortex-M3 deepsleep mode combined with peripheral + clock gating. The voltage regulator can be configured either in normal or low-power mode. + In Stop mode, all clocks in the 1.8 V domain are stopped, the PLL, the HSI and the HSE RC + oscillators are disabled. SRAM and register contents are preserved. + In Stop mode, all I/O pins keep the same state as in Run mode. + + (+) Entry: + The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_REGULATOR_VALUE, PWR_SLEEPENTRY_WFx ) + function with: + (++) PWR_REGULATOR_VALUE= PWR_MAINREGULATOR_ON: Main regulator ON. + (++) PWR_REGULATOR_VALUE= PWR_LOWPOWERREGULATOR_ON: Low Power regulator ON. + (++) PWR_SLEEPENTRY_WFx= PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction + (++) PWR_SLEEPENTRY_WFx= PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction + (+) Exit: + (++) WFI entry mode, Any EXTI Line (Internal or External) configured in Interrupt mode with NVIC configured + (++) WFE entry mode, Any EXTI Line (Internal or External) configured in Event mode. + + *** Standby mode *** + ==================== + [..] + The Standby mode allows to achieve the lowest power consumption. It is based on the + Cortex-M3 deepsleep mode, with the voltage regulator disabled. The 1.8 V 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 registers in the Backup domain + and Standby circuitry + + (+) Entry: + (++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. + (+) Exit: + (++) WKUP pin rising edge, RTC alarm event rising edge, external Reset in + NRSTpin, IWDG Reset + + *** Auto-wakeup (AWU) from low-power mode *** + ============================================= + [..] + + (+) The MCU can be woken up from low-power mode by an RTC Alarm event, + without depending on an external interrupt (Auto-wakeup mode). + + (+) RTC auto-wakeup (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. + + *** PWR Workarounds linked to Silicon Limitation *** + ==================================================== + [..] + Below the list of all silicon limitations known on STM32F1xx prouct. + + (#)Workarounds Implemented inside PWR HAL Driver + (##)Debugging Stop mode with WFE entry - overloaded the WFE by an internal 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_FALLING_EDGE(); + __HAL_PWR_PVD_EXTI_DISABLE_RISING_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) +{ + /* Enable the power voltage detector */ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_DisablePVD(void) +{ + /* Disable the power voltage detector */ + *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables the WakeUp 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 + * @retval None + */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + /* Enable the EWUPx pin */ + *(__IO uint32_t *) CSR_EWUP_BB(WakeUpPinx) = (uint32_t)ENABLE; +} + +/** + * @brief Disables the WakeUp 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 + * @retval None + */ +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameter */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + /* Disable the EWUPx pin */ + *(__IO uint32_t *) CSR_EWUP_BB(WakeUpPinx) = (uint32_t)DISABLE; +} + +/** + * @brief Enters Sleep mode. + * @note In Sleep mode, all I/O pins keep the same state as in Run mode. + * @param Regulator: Regulator state as no effect in SLEEP mode - allows to support portability from legacy software + * @param SLEEPEntry: Specifies if SLEEP mode is entered with WFI or WFE instruction. + * When WFI entry is used, tick interrupt have to be disabled if not desired as + * the interrupt wake up source. + * 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 + * @retval None + */ +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) +{ + /* Check the parameters */ + /* No check on Regulator because parameter not used in SLEEP mode */ + /* Prevent unused argument(s) compilation warning */ + UNUSED(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 + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __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 using an interrupt or a wakeup event, + * 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 + * @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)); + + /* Clear PDDS bit in PWR register to specify entering in STOP mode when CPU enter in Deepsleep */ + CLEAR_BIT(PWR->CR, PWR_CR_PDDS); + + /* Select the voltage regulator mode by setting LPDS bit in PWR register according to Regulator parameter value */ + MODIFY_REG(PWR->CR, 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 + { + /* Request Wait For Event */ + __SEV(); + PWR_OverloadWfe(); /* WFE redefine locally */ + PWR_OverloadWfe(); /* WFE redefine locally */ + } + /* 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) + * - TAMPER pin if configured for tamper or calibration out. + * - WKUP pin (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 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 M3 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 M3 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)); +} + + + +/** + * @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 + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c new file mode 100644 index 0000000..fe7515b --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c @@ -0,0 +1,1400 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 8MHz) with Flash 0 wait state, Flash prefetch buffer is enabled, + and all peripherals are off except internal SRAM, Flash and JTAG. + (+) There is no prescaler on High speed (AHB) and Low speed (APB) buses; + all peripherals mapped on these buses 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 buses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals whose clocks are not + derived from the System clock (I2S, RTC, ADC, USB OTG FS) + + ##### 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 __HAL_RCC_PPP_CLK_ENABLE() macro. + + @endverbatim + ****************************************************************************** + * @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 "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC +* @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup RCC_Private_Constants RCC Private Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/** @defgroup RCC_Private_Macros RCC Private Macros + * @{ + */ + +#define MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +static void RCC_Delay(uint32_t mdelay); + +/* Exported 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 buses clocks (SYSCLK, AHB, APB1 + and APB2). + + [..] Internal/external clock and PLL configuration + (#) HSI (high-speed internal), 8 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + (#) LSI (low-speed internal), ~40 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (#) HSE (high-speed external), 4 to 24 MHz (STM32F100xx) or 4 to 16 MHz (STM32F101x/STM32F102x/STM32F103x) or 3 to 25 MHz (STM32F105x/STM32F107x) 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 different output clocks: + (++) The first output is used to generate the high speed system clock (up to 72 MHz for STM32F10xxx or up to 24 MHz for STM32F100xx) + (++) The second output is used to generate the clock for the USB OTG FS (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-M3 NMI + (Non-Maskable Interrupt) exception vector. + + (#) MCO1 (microcontroller clock output), used to output SYSCLK, HSI, + HSE or PLL clock (divided by 2) on PA8 pin + PLL2CLK, PLL3CLK/2, PLL3CLK and XTI for STM32F105x/STM32F107x + + [..] System, AHB and APB buses 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 buses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + -@- All the peripheral clocks are derived from the System clock (SYSCLK) except: + (+@) RTC: RTC clock can be derived either from the LSI, LSE or HSE clock + divided by 128. + (+@) USB OTG FS and RTC: USB OTG FS require a frequency equal to 48 MHz + to work correctly. This clock is derived of the main PLL through PLL Multiplier. + (+@) I2S interface on STM32F105x/STM32F107x can be derived from PLL3CLK + (+@) IWDG clock which is always the LSI clock. + + (#) For STM32F10xxx, the maximum frequency of the SYSCLK and HCLK/PCLK2 is 72 MHz, PCLK1 36 MHz. + For STM32F100xx, the maximum frequency of the SYSCLK and HCLK/PCLK1/PCLK2 is 24 MHz. + Depending on the SYSCLK frequency, the flash latency should be adapted accordingly. + @endverbatim + * @{ + */ + +/* + Additional consideration on the SYSCLK based on Latency settings: + +-----------------------------------------------+ + | Latency | SYSCLK clock frequency (MHz) | + |---------------|-------------------------------| + |0WS(1CPU cycle)| 0 < SYSCLK <= 24 | + |---------------|-------------------------------| + |1WS(2CPU cycle)| 24 < SYSCLK <= 48 | + |---------------|-------------------------------| + |2WS(3CPU cycle)| 48 < SYSCLK <= 72 | + +-----------------------------------------------+ + */ + +/** + * @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, PLL2 and PLL3 are OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS and MCO1 OFF + * - All interrupts disabled + * - All flags are cleared + * @note This function does not modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL_StatusTypeDef + */ +HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + uint32_t tickstart; + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Set HSION bit */ + 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 bits to the reset value */ + MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, (0x10U << RCC_CR_HSITRIM_Pos)); + + /* 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; + } + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HSI_VALUE; + + /* Adapt Systick interrupt period */ + if (HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Second step is to 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; + } + } + + /* Ensure to reset PLLSRC and PLLMUL bits */ + CLEAR_REG(RCC->CFGR); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Reset HSEON & CSSON bits */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON | 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; + } + } + + /* Reset HSEBYP bit */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); + +#if defined(RCC_PLL2_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear PLL2ON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLL2ON); + + /* Wait till PLL2 is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLL2RDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLL2_SUPPORT */ + +#if defined(RCC_PLLI2S_SUPPORT) + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Clear PLL3ON bit */ + CLEAR_BIT(RCC->CR, RCC_CR_PLL3ON); + + /* Wait till PLL3 is disabled */ + while (READ_BIT(RCC->CR, RCC_CR_PLL3RDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLLI2S_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_CFGR2_PREDIV1) + /* Reset CFGR2 register */ + CLEAR_REG(RCC->CFGR2); +#endif /* RCC_CFGR2_PREDIV1 */ + + /* Reset all CSR flags */ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); + + /* Disable all interrupts */ + CLEAR_REG(RCC->CIR); + + 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 The PLL is not disabled when USB OTG FS clock is enabled (specific to devices with USB FS) + * @note Transitions 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 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. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(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 it is not allowed to be disabled */ + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_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 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_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI_DIV2))) + { + /* 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 disabled */ + 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; + } + } + /* To have a fully stabilized clock in the specified range, a software delay of 1ms + should be added.*/ + RCC_Delay(1); + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSI is disabled */ + 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 disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Require to disable power clock if necessary */ + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + +#if defined(RCC_CR_PLL2ON) + /*-------------------------------- PLL2 Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL2(RCC_OscInitStruct->PLL2.PLL2State)); + if ((RCC_OscInitStruct->PLL2.PLL2State) != RCC_PLL2_NONE) + { + /* This bit can not be cleared if the PLL2 clock is used indirectly as system + clock (i.e. it is used as PLL clock entry that is used as system clock). */ + if ((__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) && \ + (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && \ + ((READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) == RCC_CFGR2_PREDIV1SRC_PLL2)) + { + return HAL_ERROR; + } + else + { + if ((RCC_OscInitStruct->PLL2.PLL2State) == RCC_PLL2_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLL2_MUL(RCC_OscInitStruct->PLL2.PLL2MUL)); + assert_param(IS_RCC_HSE_PREDIV2(RCC_OscInitStruct->PLL2.HSEPrediv2Value)); + + /* Prediv2 can be written only when the PLLI2S is disabled. */ + /* Return an error only if new value is different from the programmed value */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON) && \ + (__HAL_RCC_HSE_GET_PREDIV2() != RCC_OscInitStruct->PLL2.HSEPrediv2Value)) + { + return HAL_ERROR; + } + + /* Disable the main PLL2. */ + __HAL_RCC_PLL2_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL2 is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the HSE prediv2 factor --------------------------------*/ + __HAL_RCC_HSE_PREDIV2_CONFIG(RCC_OscInitStruct->PLL2.HSEPrediv2Value); + + /* Configure the main PLL2 multiplication factors. */ + __HAL_RCC_PLL2_CONFIG(RCC_OscInitStruct->PLL2.PLL2MUL); + + /* Enable the main PLL2. */ + __HAL_RCC_PLL2_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL2 is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Set PREDIV1 source to HSE */ + CLEAR_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC); + + /* Disable the main PLL2. */ + __HAL_RCC_PLL2_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL2 is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + +#endif /* RCC_CR_PLL2ON */ + /*-------------------------------- 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_SYSCLKSOURCE_STATUS_PLLCLK) + { + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_OscInitStruct->PLL.PLLMUL)); + + /* 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 HSE prediv factor --------------------------------*/ + /* It can be written only when the PLL is disabled. Not used in PLL source is different than HSE */ + if (RCC_OscInitStruct->PLL.PLLSource == RCC_PLLSOURCE_HSE) + { + /* Check the parameter */ + assert_param(IS_RCC_HSE_PREDIV(RCC_OscInitStruct->HSEPredivValue)); +#if defined(RCC_CFGR2_PREDIV1SRC) + assert_param(IS_RCC_PREDIV1_SOURCE(RCC_OscInitStruct->Prediv1Source)); + + /* Set PREDIV1 source */ + SET_BIT(RCC->CFGR2, RCC_OscInitStruct->Prediv1Source); +#endif /* RCC_CFGR2_PREDIV1SRC */ + + /* Set PREDIV1 Value */ + __HAL_RCC_HSE_PREDIV_CONFIG(RCC_OscInitStruct->HSEPredivValue); + } + + /* Configure the main PLL clock source and multiplication factors. */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PLLMUL); + /* 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->CFGR; + if ((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_CFGR_PLLMULL) != RCC_OscInitStruct->PLL.PLLMUL)) + { + return HAL_ERROR; + } + } + } + } + + return HAL_OK; +} + +/** + * @brief Initializes the CPU, AHB and APB buses 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 + * The value of this parameter depend on device used within the same series + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated by @ref HAL_RCC_GetHCLKFreq() function called within this function + * + * @note The HSI is used (enabled by hardware) as system clock source after + * start-up 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 start-up 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. + * You can use @ref HAL_RCC_GetClockConfig() function to know which clock is + * currently used as system clock source. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(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) of the device. */ + +#if defined(FLASH_ACR_LATENCY) + /* 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; + } +} + +#endif /* FLASH_ACR_LATENCY */ +/*-------------------------- 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)); + } + + /* Set the new HCLK clock divider */ + 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) + { + /* 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; + } + } + } + +#if defined(FLASH_ACR_LATENCY) + /* 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; + } +} +#endif /* FLASH_ACR_LATENCY */ + +/*-------------------------- 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) << 3)); + } + + /* 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 MCO pin. + * @note MCO pin 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 @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_SYSCLK System clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + @if STM32F105xC + * @arg @ref RCC_MCO1SOURCE_PLLCLK PLL clock divided by 2 selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLL2CLK PLL2 clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLL3CLK_DIV2 PLL3 clock divided by 2 selected as MCO source + * @arg @ref RCC_MCO1SOURCE_EXT_HSE XT1 external 3-25 MHz oscillator clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLL3CLK PLL3 clock selected as MCO source + @endif + @if STM32F107xC + * @arg @ref RCC_MCO1SOURCE_PLLCLK PLL clock divided by 2 selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLL2CLK PLL2 clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLL3CLK_DIV2 PLL3 clock divided by 2 selected as MCO source + * @arg @ref RCC_MCO1SOURCE_EXT_HSE XT1 external 3-25 MHz oscillator clock selected as MCO source + * @arg @ref RCC_MCO1SOURCE_PLL3CLK PLL3 clock selected as MCO source + @endif + * @param RCC_MCODiv specifies the MCO DIV. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 no division applied to MCO clock + * @retval None + */ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) +{ + GPIO_InitTypeDef gpio = {0U}; + + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCOx)); + assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(RCC_MCOx); + UNUSED(RCC_MCODiv); + + /* Configure the MCO1 pin in alternate function mode */ + gpio.Mode = GPIO_MODE_AF_PP; + gpio.Speed = GPIO_SPEED_FREQ_HIGH; + gpio.Pull = GPIO_NOPULL; + gpio.Pin = MCO1_PIN; + + /* MCO1 Clock Enable */ + MCO1_CLK_ENABLE(); + + HAL_GPIO_Init(MCO1_GPIO_PORT, &gpio); + + /* Configure the MCO clock source */ + __HAL_RCC_MCO1_CONFIG(RCC_MCOSource, RCC_MCODiv); +} + +/** + * @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-M3 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 a value based on HSE_VALUE + * divided by PREDIV factor(**) + * @note If SYSCLK source is PLL, function returns a value based on HSE_VALUE + * divided by PREDIV factor(**) or HSI_VALUE(*) multiplied by the PLL factor. + * @note (*) HSI_VALUE is a constant defined in stm32f1xx_hal_conf.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f1xx_hal_conf.h file (default value + * 8 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 + * baud-rate 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) +{ +#if defined(RCC_CFGR2_PREDIV1SRC) + static const uint8_t aPLLMULFactorTable[14U] = {0, 0, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 13}; + static const uint8_t aPredivFactorTable[16U] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; +#else + static const uint8_t aPLLMULFactorTable[16U] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16}; +#if defined(RCC_CFGR2_PREDIV1) + static const uint8_t aPredivFactorTable[16U] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; +#else + static const uint8_t aPredivFactorTable[2U] = {1, 2}; +#endif /*RCC_CFGR2_PREDIV1*/ + +#endif + uint32_t tmpreg = 0U, prediv = 0U, pllclk = 0U, pllmul = 0U; + uint32_t sysclockfreq = 0U; +#if defined(RCC_CFGR2_PREDIV1SRC) + uint32_t prediv2 = 0U, pll2mul = 0U; +#endif /*RCC_CFGR2_PREDIV1SRC*/ + + tmpreg = RCC->CFGR; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (tmpreg & RCC_CFGR_SWS) + { + case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_SYSCLKSOURCE_STATUS_PLLCLK: /* PLL used as system clock */ + { + pllmul = aPLLMULFactorTable[(uint32_t)(tmpreg & RCC_CFGR_PLLMULL) >> RCC_CFGR_PLLMULL_Pos]; + if ((tmpreg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI_DIV2) + { +#if defined(RCC_CFGR2_PREDIV1) + prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV1) >> RCC_CFGR2_PREDIV1_Pos]; +#else + prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR & RCC_CFGR_PLLXTPRE) >> RCC_CFGR_PLLXTPRE_Pos]; +#endif /*RCC_CFGR2_PREDIV1*/ +#if defined(RCC_CFGR2_PREDIV1SRC) + + if (HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) + { + /* PLL2 selected as Prediv1 source */ + /* PLLCLK = PLL2CLK / PREDIV1 * PLLMUL with PLL2CLK = HSE/PREDIV2 * PLL2MUL */ + prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> RCC_CFGR2_PREDIV2_Pos) + 1; + pll2mul = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> RCC_CFGR2_PLL2MUL_Pos) + 2; + pllclk = (uint32_t)(((uint64_t)HSE_VALUE * (uint64_t)pll2mul * (uint64_t)pllmul) / ((uint64_t)prediv2 * (uint64_t)prediv)); + } + else + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */ + pllclk = (uint32_t)((HSE_VALUE * pllmul) / prediv); + } + + /* If PLLMUL was set to 13 means that it was to cover the case PLLMUL 6.5 (avoid using float) */ + /* In this case need to divide pllclk by 2 */ + if (pllmul == aPLLMULFactorTable[(uint32_t)(RCC_CFGR_PLLMULL6_5) >> RCC_CFGR_PLLMULL_Pos]) + { + pllclk = pllclk / 2; + } +#else + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */ + pllclk = (uint32_t)((HSE_VALUE * pllmul) / prediv); +#endif /*RCC_CFGR2_PREDIV1SRC*/ + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */ + pllclk = (uint32_t)((HSI_VALUE >> 1) * pllmul); + } + sysclockfreq = pllclk; + break; + } + case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ + default: /* HSI used as system clock */ + { + 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 + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Check the parameters */ + assert_param(RCC_OscInitStruct != NULL); + + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI \ + | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + +#if defined(RCC_CFGR2_PREDIV1SRC) + /* Get the Prediv1 source --------------------------------------------------*/ + RCC_OscInitStruct->Prediv1Source = READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC); +#endif /* RCC_CFGR2_PREDIV1SRC */ + + /* 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; + } + RCC_OscInitStruct->HSEPredivValue = __HAL_RCC_HSE_GET_PREDIV(); + + /* 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->CFGR & RCC_CFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLMUL = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLMULL); +#if defined(RCC_CR_PLL2ON) + /* Get the PLL2 configuration -----------------------------------------------*/ + if ((RCC->CR & RCC_CR_PLL2ON) == RCC_CR_PLL2ON) + { + RCC_OscInitStruct->PLL2.PLL2State = RCC_PLL2_ON; + } + else + { + RCC_OscInitStruct->PLL2.PLL2State = RCC_PLL2_OFF; + } + RCC_OscInitStruct->PLL2.HSEPrediv2Value = __HAL_RCC_HSE_GET_PREDIV2(); + RCC_OscInitStruct->PLL2.PLL2MUL = (uint32_t)(RCC->CFGR2 & RCC_CFGR2_PLL2MUL); +#endif /* RCC_CR_PLL2ON */ +} + +/** + * @brief Get the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that + * contains the current clock configuration. + * @param pFLatency Pointer on the Flash Latency. + * @retval None + */ +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +{ + /* Check the parameters */ + assert_param(RCC_ClkInitStruct != NULL); + assert_param(pFLatency != NULL); + + /* 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) >> 3); + +#if defined(FLASH_ACR_LATENCY) + /* Get the Flash Wait State (Latency) configuration ------------------------*/ + *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); +#else + /* For VALUE lines devices, only LATENCY_0 can be set*/ + *pFLatency = (uint32_t)FLASH_LATENCY_0; +#endif +} + +/** + * @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 This function provides delay (in milliseconds) based on CPU cycles method. + * @param mdelay: specifies the delay time length, in milliseconds. + * @retval None + */ +static void RCC_Delay(uint32_t mdelay) +{ + __IO uint32_t Delay = mdelay * (SystemCoreClock / 8U / 1000U); + do + { + __NOP(); + } + while (Delay --); +} + +/** + * @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/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c new file mode 100644 index 0000000..7e789d9 --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c @@ -0,0 +1,860 @@ +/** + ****************************************************************************** + * @file stm32f1xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extended RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extension peripheral: + * + Extended Peripheral Control 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. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_HAL_Driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/** @defgroup RCCEx RCCEx + * @brief RCC Extension HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Constants RCCEx Private Constants + * @{ + */ +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Macros RCCEx Private Macros + * @{ + */ +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + * @{ + */ + +/** @defgroup RCCEx_Exported_Functions_Group1 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) are set to their reset values. + +@endverbatim + * @{ + */ + +/** + * @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(RTC clock). + * + * @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) are set to their reset values. + * + * @note In case of STM32F105xC or STM32F107xC devices, PLLI2S will be enabled if requested on + * one of 2 I2S interfaces. When PLLI2S is enabled, you need to call HAL_RCCEx_DisablePLLI2S to + * manually disable it. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U, temp_reg = 0U; +#if defined(STM32F105xC) || defined(STM32F107xC) + uint32_t pllactive = 0U; +#endif /* STM32F105xC || STM32F107xC */ + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*------------------------------- RTC/LCD Configuration ------------------------*/ + if ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == RCC_PERIPHCLK_RTC)) + { + FlagStatus pwrclkchanged = RESET; + + /* check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* As soon as function is called to change RTC clock source, activation of the + power domain is done. */ + /* 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; + } + } + } + + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + temp_reg = (RCC->BDCR & RCC_BDCR_RTCSEL); + if ((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + temp_reg = (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 = temp_reg; + + /* Wait for LSERDY if LSE was enabled */ + if (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSEON)) + { + /* 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; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + + /* Require to disable power clock if necessary */ + if (pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + + /*------------------------------ ADC clock Configuration ------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC) + { + /* Check the parameters */ + assert_param(IS_RCC_ADCPLLCLK_DIV(PeriphClkInit->AdcClockSelection)); + + /* Configure the ADC clock source */ + __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection); + } + +#if defined(STM32F105xC) || defined(STM32F107xC) + /*------------------------------ I2S2 Configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S2) == RCC_PERIPHCLK_I2S2) + { + /* Check the parameters */ + assert_param(IS_RCC_I2S2CLKSOURCE(PeriphClkInit->I2s2ClockSelection)); + + /* Configure the I2S2 clock source */ + __HAL_RCC_I2S2_CONFIG(PeriphClkInit->I2s2ClockSelection); + } + + /*------------------------------ I2S3 Configuration ------------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S3) == RCC_PERIPHCLK_I2S3) + { + /* Check the parameters */ + assert_param(IS_RCC_I2S3CLKSOURCE(PeriphClkInit->I2s3ClockSelection)); + + /* Configure the I2S3 clock source */ + __HAL_RCC_I2S3_CONFIG(PeriphClkInit->I2s3ClockSelection); + } + + /*------------------------------ PLL I2S Configuration ----------------------*/ + /* Check that PLLI2S need to be enabled */ + if (HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_I2S2SRC) || HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_I2S3SRC)) + { + /* Update flag to indicate that PLL I2S should be active */ + pllactive = 1; + } + + /* Check if PLL I2S need to be enabled */ + if (pllactive == 1) + { + /* Enable PLL I2S only if not active */ + if (HAL_IS_BIT_CLR(RCC->CR, RCC_CR_PLL3ON)) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLI2S_MUL(PeriphClkInit->PLLI2S.PLLI2SMUL)); + assert_param(IS_RCC_HSE_PREDIV2(PeriphClkInit->PLLI2S.HSEPrediv2Value)); + + /* Prediv2 can be written only when the PLL2 is disabled. */ + /* Return an error only if new value is different from the programmed value */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL2ON) && \ + (__HAL_RCC_HSE_GET_PREDIV2() != PeriphClkInit->PLLI2S.HSEPrediv2Value)) + { + return HAL_ERROR; + } + + /* Configure the HSE prediv2 factor --------------------------------*/ + __HAL_RCC_HSE_PREDIV2_CONFIG(PeriphClkInit->PLLI2S.HSEPrediv2Value); + + /* Configure the main PLLI2S multiplication factors. */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SMUL); + + /* Enable the main PLLI2S. */ + __HAL_RCC_PLLI2S_ENABLE(); + + /* Get Start 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 HAL_TIMEOUT; + } + } + } + else + { + /* Return an error only if user wants to change the PLLI2SMUL whereas PLLI2S is active */ + if (READ_BIT(RCC->CFGR2, RCC_CFGR2_PLL3MUL) != PeriphClkInit->PLLI2S.PLLI2SMUL) + { + return HAL_ERROR; + } + } + } +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) + /*------------------------------ USB clock Configuration ------------------*/ + if (((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB) + { + /* Check the parameters */ + assert_param(IS_RCC_USBPLLCLK_DIV(PeriphClkInit->UsbClockSelection)); + + /* Configure the USB clock source */ + __HAL_RCC_USB_CONFIG(PeriphClkInit->UsbClockSelection); + } +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + + return HAL_OK; +} + +/** + * @brief Get the PeriphClkInit according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * returns the configuration information for the Extended Peripherals clocks(RTC, I2S, ADC clocks). + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t srcclk = 0U; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_RTC; + + /* Get the RTC configuration -----------------------------------------------*/ + srcclk = __HAL_RCC_GET_RTC_SOURCE(); + /* Source clock is LSE or LSI*/ + PeriphClkInit->RTCClockSelection = srcclk; + + /* Get the ADC clock configuration -----------------------------------------*/ + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC; + PeriphClkInit->AdcClockSelection = __HAL_RCC_GET_ADC_SOURCE(); + +#if defined(STM32F105xC) || defined(STM32F107xC) + /* Get the I2S2 clock configuration -----------------------------------------*/ + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S2; + PeriphClkInit->I2s2ClockSelection = __HAL_RCC_GET_I2S2_SOURCE(); + + /* Get the I2S3 clock configuration -----------------------------------------*/ + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S3; + PeriphClkInit->I2s3ClockSelection = __HAL_RCC_GET_I2S3_SOURCE(); + +#endif /* STM32F105xC || STM32F107xC */ + +#if defined(STM32F103xE) || defined(STM32F103xG) + /* Get the I2S2 clock configuration -----------------------------------------*/ + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S2; + PeriphClkInit->I2s2ClockSelection = RCC_I2S2CLKSOURCE_SYSCLK; + + /* Get the I2S3 clock configuration -----------------------------------------*/ + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S3; + PeriphClkInit->I2s3ClockSelection = RCC_I2S3CLKSOURCE_SYSCLK; + +#endif /* STM32F103xE || STM32F103xG */ + +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) + /* Get the USB clock configuration -----------------------------------------*/ + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USB; + PeriphClkInit->UsbClockSelection = __HAL_RCC_GET_USB_SOURCE(); +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ +} + +/** + * @brief Returns the peripheral clock frequency + * @note Returns 0 if peripheral clock is unknown + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC ADC peripheral clock + @if STM32F103xE + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + @endif + @if STM32F103xG + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + @endif + @if STM32F105xC + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + @endif + @if STM32F107xC + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S3 I2S3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S2 I2S2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + @endif + @if STM32F102xx + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + @endif + @if STM32F103xx + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + @endif + * @retval Frequency in Hz (0: means that no available frequency for the peripheral) + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ +#if defined(STM32F105xC) || defined(STM32F107xC) + static const uint8_t aPLLMULFactorTable[14U] = {0, 0, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 13}; + static const uint8_t aPredivFactorTable[16U] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + + uint32_t prediv1 = 0U, pllclk = 0U, pllmul = 0U; + uint32_t pll2mul = 0U, pll3mul = 0U, prediv2 = 0U; +#endif /* STM32F105xC || STM32F107xC */ +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6) || \ + defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) + static const uint8_t aPLLMULFactorTable[16U] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16}; + static const uint8_t aPredivFactorTable[2U] = {1, 2}; + + uint32_t prediv1 = 0U, pllclk = 0U, pllmul = 0U; +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG */ + uint32_t temp_reg = 0U, frequency = 0U; + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClk)); + + switch (PeriphClk) + { +#if defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6)\ + || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG)\ + || defined(STM32F105xC) || defined(STM32F107xC) + case RCC_PERIPHCLK_USB: + { + /* Get RCC configuration ------------------------------------------------------*/ + temp_reg = RCC->CFGR; + + /* Check if PLL is enabled */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLON)) + { + pllmul = aPLLMULFactorTable[(uint32_t)(temp_reg & RCC_CFGR_PLLMULL) >> RCC_CFGR_PLLMULL_Pos]; + if ((temp_reg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI_DIV2) + { +#if defined(STM32F105xC) || defined(STM32F107xC) || defined(STM32F100xB)\ + || defined(STM32F100xE) + prediv1 = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV1) >> RCC_CFGR2_PREDIV1_Pos]; +#else + prediv1 = aPredivFactorTable[(uint32_t)(RCC->CFGR & RCC_CFGR_PLLXTPRE) >> RCC_CFGR_PLLXTPRE_Pos]; +#endif /* STM32F105xC || STM32F107xC || STM32F100xB || STM32F100xE */ + +#if defined(STM32F105xC) || defined(STM32F107xC) + if (HAL_IS_BIT_SET(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) + { + /* PLL2 selected as Prediv1 source */ + /* PLLCLK = PLL2CLK / PREDIV1 * PLLMUL with PLL2CLK = HSE/PREDIV2 * PLL2MUL */ + prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> RCC_CFGR2_PREDIV2_Pos) + 1; + pll2mul = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> RCC_CFGR2_PLL2MUL_Pos) + 2; + pllclk = (uint32_t)((((HSE_VALUE / prediv2) * pll2mul) / prediv1) * pllmul); + } + else + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */ + pllclk = (uint32_t)((HSE_VALUE / prediv1) * pllmul); + } + + /* If PLLMUL was set to 13 means that it was to cover the case PLLMUL 6.5 (avoid using float) */ + /* In this case need to divide pllclk by 2 */ + if (pllmul == aPLLMULFactorTable[(uint32_t)(RCC_CFGR_PLLMULL6_5) >> RCC_CFGR_PLLMULL_Pos]) + { + pllclk = pllclk / 2; + } +#else + if ((temp_reg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI_DIV2) + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV1 * PLLMUL */ + pllclk = (uint32_t)((HSE_VALUE / prediv1) * pllmul); + } +#endif /* STM32F105xC || STM32F107xC */ + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */ + pllclk = (uint32_t)((HSI_VALUE >> 1) * pllmul); + } + + /* Calcul of the USB frequency*/ +#if defined(STM32F105xC) || defined(STM32F107xC) + /* USBCLK = PLLVCO = (2 x PLLCLK) / USB prescaler */ + if (__HAL_RCC_GET_USB_SOURCE() == RCC_USBCLKSOURCE_PLL_DIV2) + { + /* Prescaler of 2 selected for USB */ + frequency = pllclk; + } + else + { + /* Prescaler of 3 selected for USB */ + frequency = (2 * pllclk) / 3; + } +#else + /* USBCLK = PLLCLK / USB prescaler */ + if (__HAL_RCC_GET_USB_SOURCE() == RCC_USBCLKSOURCE_PLL) + { + /* No prescaler selected for USB */ + frequency = pllclk; + } + else + { + /* Prescaler of 1.5 selected for USB */ + frequency = (pllclk * 2) / 3; + } +#endif + } + break; + } +#endif /* STM32F102x6 || STM32F102xB || STM32F103x6 || STM32F103xB || STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ +#if defined(STM32F103xE) || defined(STM32F103xG) || defined(STM32F105xC) || defined(STM32F107xC) + case RCC_PERIPHCLK_I2S2: + { +#if defined(STM32F103xE) || defined(STM32F103xG) + /* SYSCLK used as source clock for I2S2 */ + frequency = HAL_RCC_GetSysClockFreq(); +#else + if (__HAL_RCC_GET_I2S2_SOURCE() == RCC_I2S2CLKSOURCE_SYSCLK) + { + /* SYSCLK used as source clock for I2S2 */ + frequency = HAL_RCC_GetSysClockFreq(); + } + else + { + /* Check if PLLI2S is enabled */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON)) + { + /* PLLI2SVCO = 2 * PLLI2SCLK = 2 * (HSE/PREDIV2 * PLL3MUL) */ + prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> RCC_CFGR2_PREDIV2_Pos) + 1; + pll3mul = ((RCC->CFGR2 & RCC_CFGR2_PLL3MUL) >> RCC_CFGR2_PLL3MUL_Pos) + 2; + frequency = (uint32_t)(2 * ((HSE_VALUE / prediv2) * pll3mul)); + } + } +#endif /* STM32F103xE || STM32F103xG */ + break; + } + case RCC_PERIPHCLK_I2S3: + { +#if defined(STM32F103xE) || defined(STM32F103xG) + /* SYSCLK used as source clock for I2S3 */ + frequency = HAL_RCC_GetSysClockFreq(); +#else + if (__HAL_RCC_GET_I2S3_SOURCE() == RCC_I2S3CLKSOURCE_SYSCLK) + { + /* SYSCLK used as source clock for I2S3 */ + frequency = HAL_RCC_GetSysClockFreq(); + } + else + { + /* Check if PLLI2S is enabled */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON)) + { + /* PLLI2SVCO = 2 * PLLI2SCLK = 2 * (HSE/PREDIV2 * PLL3MUL) */ + prediv2 = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> RCC_CFGR2_PREDIV2_Pos) + 1; + pll3mul = ((RCC->CFGR2 & RCC_CFGR2_PLL3MUL) >> RCC_CFGR2_PLL3MUL_Pos) + 2; + frequency = (uint32_t)(2 * ((HSE_VALUE / prediv2) * pll3mul)); + } + } +#endif /* STM32F103xE || STM32F103xG */ + break; + } +#endif /* STM32F103xE || STM32F103xG || STM32F105xC || STM32F107xC */ + case RCC_PERIPHCLK_RTC: + { + /* Get RCC BDCR configuration ------------------------------------------------------*/ + temp_reg = RCC->BDCR; + + /* Check if LSE is ready if RTC clock selection is LSE */ + if (((temp_reg & RCC_BDCR_RTCSEL) == RCC_RTCCLKSOURCE_LSE) && (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + /* Check if LSI is ready if RTC clock selection is LSI */ + else if (((temp_reg & RCC_BDCR_RTCSEL) == RCC_RTCCLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) + { + frequency = LSI_VALUE; + } + else if (((temp_reg & RCC_BDCR_RTCSEL) == RCC_RTCCLKSOURCE_HSE_DIV128) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))) + { + frequency = HSE_VALUE / 128U; + } + /* Clock not enabled for RTC*/ + else + { + /* nothing to do: frequency already initialized to 0U */ + } + break; + } + case RCC_PERIPHCLK_ADC: + { + frequency = HAL_RCC_GetPCLK2Freq() / (((__HAL_RCC_GET_ADC_SOURCE() >> RCC_CFGR_ADCPRE_Pos) + 1) * 2); + break; + } + default: + { + break; + } + } + return (frequency); +} + +/** + * @} + */ + +#if defined(STM32F105xC) || defined(STM32F107xC) +/** @defgroup RCCEx_Exported_Functions_Group2 PLLI2S Management function + * @brief PLLI2S Management functions + * +@verbatim + =============================================================================== + ##### Extended PLLI2S Management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the PLLI2S + activation or deactivation +@endverbatim + * @{ + */ + +/** + * @brief Enable PLLI2S + * @param PLLI2SInit pointer to an RCC_PLLI2SInitTypeDef structure that + * contains the configuration information for the PLLI2S + * @note The PLLI2S configuration not modified if used by I2S2 or I2S3 Interface. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit) +{ + uint32_t tickstart = 0U; + + /* Check that PLL I2S has not been already enabled by I2S2 or I2S3*/ + if (HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S2SRC) && HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S3SRC)) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLI2S_MUL(PLLI2SInit->PLLI2SMUL)); + assert_param(IS_RCC_HSE_PREDIV2(PLLI2SInit->HSEPrediv2Value)); + + /* Prediv2 can be written only when the PLL2 is disabled. */ + /* Return an error only if new value is different from the programmed value */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL2ON) && \ + (__HAL_RCC_HSE_GET_PREDIV2() != PLLI2SInit->HSEPrediv2Value)) + { + return HAL_ERROR; + } + + /* Disable the main PLLI2S. */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Get Start 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 HAL_TIMEOUT; + } + } + + /* Configure the HSE prediv2 factor --------------------------------*/ + __HAL_RCC_HSE_PREDIV2_CONFIG(PLLI2SInit->HSEPrediv2Value); + + + /* Configure the main PLLI2S multiplication factors. */ + __HAL_RCC_PLLI2S_CONFIG(PLLI2SInit->PLLI2SMUL); + + /* Enable the main PLLI2S. */ + __HAL_RCC_PLLI2S_ENABLE(); + + /* Get Start 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 HAL_TIMEOUT; + } + } + } + else + { + /* PLLI2S cannot be modified as already used by I2S2 or I2S3 */ + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Disable PLLI2S + * @note PLLI2S is not disabled if used by I2S2 or I2S3 Interface. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void) +{ + uint32_t tickstart = 0U; + + /* Disable PLL I2S as not requested by I2S2 or I2S3*/ + if (HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S2SRC) && HAL_IS_BIT_CLR(RCC->CFGR2, RCC_CFGR2_I2S3SRC)) + { + /* Disable the main PLLI2S. */ + __HAL_RCC_PLLI2S_DISABLE(); + + /* Get Start 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 HAL_TIMEOUT; + } + } + } + else + { + /* PLLI2S is currently used by I2S2 or I2S3. Cannot be disabled.*/ + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup RCCEx_Exported_Functions_Group3 PLL2 Management function + * @brief PLL2 Management functions + * +@verbatim + =============================================================================== + ##### Extended PLL2 Management functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the PLL2 + activation or deactivation +@endverbatim + * @{ + */ + +/** + * @brief Enable PLL2 + * @param PLL2Init pointer to an RCC_PLL2InitTypeDef structure that + * contains the configuration information for the PLL2 + * @note The PLL2 configuration not modified if used indirectly as system clock. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_EnablePLL2(RCC_PLL2InitTypeDef *PLL2Init) +{ + uint32_t tickstart = 0U; + + /* This bit can not be cleared if the PLL2 clock is used indirectly as system + clock (i.e. it is used as PLL clock entry that is used as system clock). */ + if ((__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) && \ + (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && \ + ((READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) == RCC_CFGR2_PREDIV1SRC_PLL2)) + { + return HAL_ERROR; + } + else + { + /* Check the parameters */ + assert_param(IS_RCC_PLL2_MUL(PLL2Init->PLL2MUL)); + assert_param(IS_RCC_HSE_PREDIV2(PLL2Init->HSEPrediv2Value)); + + /* Prediv2 can be written only when the PLLI2S is disabled. */ + /* Return an error only if new value is different from the programmed value */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLL3ON) && \ + (__HAL_RCC_HSE_GET_PREDIV2() != PLL2Init->HSEPrediv2Value)) + { + return HAL_ERROR; + } + + /* Disable the main PLL2. */ + __HAL_RCC_PLL2_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL2 is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the HSE prediv2 factor --------------------------------*/ + __HAL_RCC_HSE_PREDIV2_CONFIG(PLL2Init->HSEPrediv2Value); + + /* Configure the main PLL2 multiplication factors. */ + __HAL_RCC_PLL2_CONFIG(PLL2Init->PLL2MUL); + + /* Enable the main PLL2. */ + __HAL_RCC_PLL2_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL2 is ready */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) == RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + return HAL_OK; +} + +/** + * @brief Disable PLL2 + * @note PLL2 is not disabled if used indirectly as system clock. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_DisablePLL2(void) +{ + uint32_t tickstart = 0U; + + /* This bit can not be cleared if the PLL2 clock is used indirectly as system + clock (i.e. it is used as PLL clock entry that is used as system clock). */ + if ((__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE) && \ + (__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && \ + ((READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV1SRC)) == RCC_CFGR2_PREDIV1SRC_PLL2)) + { + return HAL_ERROR; + } + else + { + /* Disable the main PLL2. */ + __HAL_RCC_PLL2_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL2 is disabled */ + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLL2RDY) != RESET) + { + if ((HAL_GetTick() - tickstart) > PLL2_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + return HAL_OK; +} + +/** + * @} + */ +#endif /* STM32F105xC || STM32F107xC */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ + +/** + * @} + */ + + diff --git a/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c new file mode 100644 index 0000000..7e481aa --- /dev/null +++ b/arcadestick_software/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c @@ -0,0 +1,2897 @@ +/** + ****************************************************************************** + * @file stm32f1xx_ll_usb.c + * @author MCD Application Team + * @brief USB Low Layer HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the USB Peripheral Controller: + * + Initialization/de-initialization functions + * + I/O 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 ##### + ============================================================================== + [..] + (#) Fill parameters of Init structure in USB_CfgTypeDef structure. + + (#) Call USB_CoreInit() API to initialize the USB Core peripheral. + + (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes. + + @endverbatim + + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx_hal.h" + +/** @addtogroup STM32F1xx_LL_USB_DRIVER + * @{ + */ + +#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) +#if defined (USB) || defined (USB_OTG_FS) +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +#if defined (USB_OTG_FS) +static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup USB_LL_Exported_Functions USB Low Layer Exported Functions + * @{ + */ + +/** @defgroup USB_LL_Exported_Functions_Group1 Initialization/de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization/de-initialization functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the USB Core + * @param USBx USB Instance + * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) +{ + HAL_StatusTypeDef ret; + + /* Select FS Embedded PHY */ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; + + /* Reset after a PHY select */ + ret = USB_CoreReset(USBx); + + /* Activate the USB Transceiver */ + USBx->GCCFG |= USB_OTG_GCCFG_PWRDWN; + + return ret; +} + + +/** + * @brief Set the USB turnaround time + * @param USBx USB Instance + * @param hclk: AHB clock frequency + * @retval USB turnaround time In PHY Clocks number + */ +HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, + uint32_t hclk, uint8_t speed) +{ + uint32_t UsbTrd; + + /* The USBTRD is configured according to the tables below, depending on AHB frequency + used by application. In the low AHB frequency range it is used to stretch enough the USB response + time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access + latency to the Data FIFO */ + if (speed == USBD_FS_SPEED) + { + if ((hclk >= 14200000U) && (hclk < 15000000U)) + { + /* hclk Clock Range between 14.2-15 MHz */ + UsbTrd = 0xFU; + } + else if ((hclk >= 15000000U) && (hclk < 16000000U)) + { + /* hclk Clock Range between 15-16 MHz */ + UsbTrd = 0xEU; + } + else if ((hclk >= 16000000U) && (hclk < 17200000U)) + { + /* hclk Clock Range between 16-17.2 MHz */ + UsbTrd = 0xDU; + } + else if ((hclk >= 17200000U) && (hclk < 18500000U)) + { + /* hclk Clock Range between 17.2-18.5 MHz */ + UsbTrd = 0xCU; + } + else if ((hclk >= 18500000U) && (hclk < 20000000U)) + { + /* hclk Clock Range between 18.5-20 MHz */ + UsbTrd = 0xBU; + } + else if ((hclk >= 20000000U) && (hclk < 21800000U)) + { + /* hclk Clock Range between 20-21.8 MHz */ + UsbTrd = 0xAU; + } + else if ((hclk >= 21800000U) && (hclk < 24000000U)) + { + /* hclk Clock Range between 21.8-24 MHz */ + UsbTrd = 0x9U; + } + else if ((hclk >= 24000000U) && (hclk < 27700000U)) + { + /* hclk Clock Range between 24-27.7 MHz */ + UsbTrd = 0x8U; + } + else if ((hclk >= 27700000U) && (hclk < 32000000U)) + { + /* hclk Clock Range between 27.7-32 MHz */ + UsbTrd = 0x7U; + } + else /* if(hclk >= 32000000) */ + { + /* hclk Clock Range between 32-200 MHz */ + UsbTrd = 0x6U; + } + } + else + { + UsbTrd = USBD_DEFAULT_TRDT_VALUE; + } + + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT; + USBx->GUSBCFG |= (uint32_t)((UsbTrd << 10) & USB_OTG_GUSBCFG_TRDT); + + return HAL_OK; +} + +/** + * @brief USB_EnableGlobalInt + * Enables the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT; + return HAL_OK; +} + +/** + * @brief USB_DisableGlobalInt + * Disable the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx) +{ + USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; + return HAL_OK; +} + +/** + * @brief USB_SetCurrentMode Set functional mode + * @param USBx Selected device + * @param mode current core mode + * This parameter can be one of these values: + * @arg USB_DEVICE_MODE Peripheral mode + * @arg USB_HOST_MODE Host mode + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx, USB_ModeTypeDef mode) +{ + uint32_t ms = 0U; + + USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); + + if (mode == USB_HOST_MODE) + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; + + do + { + HAL_Delay(10U); + ms += 10U; + } while ((USB_GetMode(USBx) != (uint32_t)USB_HOST_MODE) && (ms < HAL_USB_CURRENT_MODE_MAX_DELAY_MS)); + } + else if (mode == USB_DEVICE_MODE) + { + USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; + + do + { + HAL_Delay(10U); + ms += 10U; + } while ((USB_GetMode(USBx) != (uint32_t)USB_DEVICE_MODE) && (ms < HAL_USB_CURRENT_MODE_MAX_DELAY_MS)); + } + else + { + return HAL_ERROR; + } + + if (ms == HAL_USB_CURRENT_MODE_MAX_DELAY_MS) + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief USB_DevInit Initializes the USB_OTG controller registers + * for device mode + * @param USBx Selected device + * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i; + + for (i = 0U; i < 15U; i++) + { + USBx->DIEPTXF[i] = 0U; + } + + /* Enable HW VBUS sensing */ + USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN; + + /* Restart the Phy Clock */ + USBx_PCGCCTL = 0U; + + /* Set Core speed to Full speed mode */ + (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); + + /* Flush the FIFOs */ + if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ + { + ret = HAL_ERROR; + } + + if (USB_FlushRxFifo(USBx) != HAL_OK) + { + ret = HAL_ERROR; + } + + /* Clear all pending Device Interrupts */ + USBx_DEVICE->DIEPMSK = 0U; + USBx_DEVICE->DOEPMSK = 0U; + USBx_DEVICE->DAINTMSK = 0U; + + for (i = 0U; i < cfg.dev_endpoints; i++) + { + if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + if (i == 0U) + { + USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_SNAK; + } + else + { + USBx_INEP(i)->DIEPCTL = USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK; + } + } + else + { + USBx_INEP(i)->DIEPCTL = 0U; + } + + USBx_INEP(i)->DIEPTSIZ = 0U; + USBx_INEP(i)->DIEPINT = 0xFB7FU; + } + + for (i = 0U; i < cfg.dev_endpoints; i++) + { + if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + if (i == 0U) + { + USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK; + } + else + { + USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK; + } + } + else + { + USBx_OUTEP(i)->DOEPCTL = 0U; + } + + USBx_OUTEP(i)->DOEPTSIZ = 0U; + USBx_OUTEP(i)->DOEPINT = 0xFB7FU; + } + + USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); + + /* Disable all interrupts. */ + USBx->GINTMSK = 0U; + + /* Clear any pending interrupts */ + USBx->GINTSTS = 0xBFFFFFFFU; + + /* Enable the common interrupts */ + USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; + + /* Enable interrupts matching to the Device mode ONLY */ + USBx->GINTMSK |= USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST | + USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT | + USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IISOIXFRM | + USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM; + + if (cfg.Sof_enable != 0U) + { + USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM; + } + + if (cfg.vbus_sensing_enable == 1U) + { + USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT); + } + + return ret; +} + +/** + * @brief USB_FlushTxFifo Flush a Tx FIFO + * @param USBx Selected device + * @param num FIFO number + * This parameter can be a value from 1 to 15 + 15 means Flush all Tx FIFOs + * @retval HAL status + */ +HAL_StatusTypeDef USB_FlushTxFifo(USB_OTG_GlobalTypeDef *USBx, uint32_t num) +{ + __IO uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do + { + count++; + + if (count > HAL_USB_TIMEOUT) + { + return HAL_TIMEOUT; + } + } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + /* Flush TX Fifo */ + count = 0U; + USBx->GRSTCTL = (USB_OTG_GRSTCTL_TXFFLSH | (num << 6)); + + do + { + count++; + + if (count > HAL_USB_TIMEOUT) + { + return HAL_TIMEOUT; + } + } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); + + return HAL_OK; +} + +/** + * @brief USB_FlushRxFifo Flush Rx FIFO + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) +{ + __IO uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do + { + count++; + + if (count > HAL_USB_TIMEOUT) + { + return HAL_TIMEOUT; + } + } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + /* Flush RX Fifo */ + count = 0U; + USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; + + do + { + count++; + + if (count > HAL_USB_TIMEOUT) + { + return HAL_TIMEOUT; + } + } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); + + return HAL_OK; +} + +/** + * @brief USB_SetDevSpeed Initializes the DevSpd field of DCFG register + * depending the PHY type and the enumeration speed of the device. + * @param USBx Selected device + * @param speed device speed + * This parameter can be one of these values: + * @arg USB_OTG_SPEED_FULL: Full speed mode + * @retval Hal status + */ +HAL_StatusTypeDef USB_SetDevSpeed(const USB_OTG_GlobalTypeDef *USBx, uint8_t speed) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCFG |= speed; + return HAL_OK; +} + +/** + * @brief USB_GetDevSpeed Return the Dev Speed + * @param USBx Selected device + * @retval speed device speed + * This parameter can be one of these values: + * @arg USBD_FS_SPEED: Full speed mode + */ +uint8_t USB_GetDevSpeed(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint8_t speed; + uint32_t DevEnumSpeed = USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD; + + if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || + (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) + { + speed = USBD_FS_SPEED; + } + else + { + speed = 0xFU; + } + + return speed; +} + +/** + * @brief Activate and configure an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + if (ep->is_in == 1U) + { + USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); + + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_USBAEP) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | (epnum << 22) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_USBAEP; + } + } + else + { + USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); + + if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) + { + USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DOEPCTL_USBAEP; + } + } + return HAL_OK; +} + +/** + * @brief Activate and configure a dedicated endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* Read DEPCTLn register */ + if (ep->is_in == 1U) + { + if (((USBx_INEP(epnum)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= (ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | (epnum << 22) | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_USBAEP; + } + + USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK)); + } + else + { + if (((USBx_OUTEP(epnum)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0U) + { + USBx_OUTEP(epnum)->DOEPCTL |= (ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ) | + ((uint32_t)ep->type << 18) | (epnum << 22) | + USB_OTG_DOEPCTL_USBAEP; + } + + USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16); + } + + return HAL_OK; +} + +/** + * @brief De-activate and de-initialize an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeactivateEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* Read DEPCTLn register */ + if (ep->is_in == 1U) + { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); + USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | + USB_OTG_DIEPCTL_MPSIZ | + USB_OTG_DIEPCTL_TXFNUM | + USB_OTG_DIEPCTL_SD0PID_SEVNFRM | + USB_OTG_DIEPCTL_EPTYP); + } + else + { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); + USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | + USB_OTG_DOEPCTL_MPSIZ | + USB_OTG_DOEPCTL_SD0PID_SEVNFRM | + USB_OTG_DOEPCTL_EPTYP); + } + + return HAL_OK; +} + +/** + * @brief De-activate and de-initialize a dedicated endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + /* Read DEPCTLn register */ + if (ep->is_in == 1U) + { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + + USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); + } + else + { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; + USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); + } + + return HAL_OK; +} + +/** + * @brief USB_EPStartXfer : setup and starts a transfer over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + uint16_t pktcnt; + + /* IN endpoint */ + if (ep->is_in == 1U) + { + /* Zero Length Packet? */ + if (ep->xfer_len == 0U) + { + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); + + if (epnum == 0U) + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + } + + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1U << 19)); + } + else + { + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & + (((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket) << 19)); + } + + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); + + if (ep->type == EP_TYPE_ISOC) + { + USBx_INEP(epnum)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); + USBx_INEP(epnum)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1U << 29)); + } + } + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0U) + { + USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); + } + } + else + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + + (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len); + } + } + else /* OUT endpoint */ + { + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); + USBx_OUTEP(epnum)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); + + if (epnum == 0U) + { + if (ep->xfer_len > 0U) + { + ep->xfer_len = ep->maxpacket; + } + + /* Store transfer size, for EP0 this is equal to endpoint max packet size */ + ep->xfer_size = ep->maxpacket; + + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->xfer_size); + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + } + else + { + if (ep->xfer_len == 0U) + { + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket); + USBx_OUTEP(epnum)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + } + else + { + pktcnt = (uint16_t)((ep->xfer_len + ep->maxpacket - 1U) / ep->maxpacket); + ep->xfer_size = ep->maxpacket * pktcnt; + + USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_PKTCNT & ((uint32_t)pktcnt << 19); + USBx_OUTEP(epnum)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_XFRSIZ & ep->xfer_size; + } + } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM; + } + else + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; + } + } + /* EP enable */ + USBx_OUTEP(epnum)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); + } + + return HAL_OK; +} + + +/** + * @brief USB_EPStoptXfer Stop transfer on an EP + * @param USBx usb device instance + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStopXfer(const USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) +{ + __IO uint32_t count = 0U; + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + + /* IN endpoint */ + if (ep->is_in == 1U) + { + /* EP enable, IN data in FIFO */ + if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_SNAK); + USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_EPDIS); + + do + { + count++; + + if (count > 10000U) + { + ret = HAL_ERROR; + break; + } + } while (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA); + } + } + else /* OUT endpoint */ + { + if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_SNAK); + USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_EPDIS); + + do + { + count++; + + if (count > 10000U) + { + ret = HAL_ERROR; + break; + } + } while (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA); + } + } + + return ret; +} + + +/** + * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated + * with the EP/channel + * @param USBx Selected device + * @param src pointer to source buffer + * @param ch_ep_num endpoint or host channel number + * @param len Number of bytes to write + * @retval HAL status + */ +HAL_StatusTypeDef USB_WritePacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *src, + uint8_t ch_ep_num, uint16_t len) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint8_t *pSrc = src; + uint32_t count32b; + uint32_t i; + + count32b = ((uint32_t)len + 3U) / 4U; + for (i = 0U; i < count32b; i++) + { + USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); + pSrc++; + pSrc++; + pSrc++; + pSrc++; + } + + return HAL_OK; +} + +/** + * @brief USB_ReadPacket : read a packet from the RX FIFO + * @param USBx Selected device + * @param dest source pointer + * @param len Number of bytes to read + * @retval pointer to destination buffer + */ +void *USB_ReadPacket(const USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint8_t *pDest = dest; + uint32_t pData; + uint32_t i; + uint32_t count32b = (uint32_t)len >> 2U; + uint16_t remaining_bytes = len % 4U; + + for (i = 0U; i < count32b; i++) + { + __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); + pDest++; + pDest++; + pDest++; + pDest++; + } + + /* When Number of data is not word aligned, read the remaining byte */ + if (remaining_bytes != 0U) + { + i = 0U; + __UNALIGNED_UINT32_WRITE(&pData, USBx_DFIFO(0U)); + + do + { + *(uint8_t *)pDest = (uint8_t)(pData >> (8U * (uint8_t)(i))); + i++; + pDest++; + remaining_bytes--; + } while (remaining_bytes != 0U); + } + + return ((void *)pDest); +} + +/** + * @brief USB_EPSetStall : set a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPSetStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + if (ep->is_in == 1U) + { + if (((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == 0U) && (epnum != 0U)) + { + USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS); + } + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_STALL; + } + else + { + if (((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == 0U) && (epnum != 0U)) + { + USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS); + } + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_STALL; + } + + return HAL_OK; +} + +/** + * @brief USB_EPClearStall : Clear a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPClearStall(const USB_OTG_GlobalTypeDef *USBx, const USB_OTG_EPTypeDef *ep) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t epnum = (uint32_t)ep->num; + + if (ep->is_in == 1U) + { + USBx_INEP(epnum)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */ + } + } + else + { + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_BULK)) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */ + } + } + return HAL_OK; +} + +/** + * @brief USB_StopDevice : Stop the usb device mode + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx) +{ + HAL_StatusTypeDef ret; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i; + + /* Clear Pending interrupt */ + for (i = 0U; i < 15U; i++) + { + USBx_INEP(i)->DIEPINT = 0xFB7FU; + USBx_OUTEP(i)->DOEPINT = 0xFB7FU; + } + + /* Clear interrupt masks */ + USBx_DEVICE->DIEPMSK = 0U; + USBx_DEVICE->DOEPMSK = 0U; + USBx_DEVICE->DAINTMSK = 0U; + + /* Flush the FIFO */ + ret = USB_FlushRxFifo(USBx); + if (ret != HAL_OK) + { + return ret; + } + + ret = USB_FlushTxFifo(USBx, 0x10U); + if (ret != HAL_OK) + { + return ret; + } + + return ret; +} + +/** + * @brief USB_SetDevAddress : Stop the usb device mode + * @param USBx Selected device + * @param address new device address to be assigned + * This parameter can be a value from 0 to 255 + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetDevAddress(const USB_OTG_GlobalTypeDef *USBx, uint8_t address) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_DEVICE->DCFG &= ~(USB_OTG_DCFG_DAD); + USBx_DEVICE->DCFG |= ((uint32_t)address << 4) & USB_OTG_DCFG_DAD; + + return HAL_OK; +} + +/** + * @brief USB_DevConnect : Connect the USB device by enabling Rpu + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevConnect(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + /* In case phy is stopped, ensure to ungate and restore the phy CLK */ + USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK); + + USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS; + + return HAL_OK; +} + +/** + * @brief USB_DevDisconnect : Disconnect the USB device by disabling Rpu + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevDisconnect(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + /* In case phy is stopped, ensure to ungate and restore the phy CLK */ + USBx_PCGCCTL &= ~(USB_OTG_PCGCCTL_STOPCLK | USB_OTG_PCGCCTL_GATECLK); + + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; + + return HAL_OK; +} + +/** + * @brief USB_ReadInterrupts: return the global USB interrupt status + * @param USBx Selected device + * @retval USB Global Interrupt status + */ +uint32_t USB_ReadInterrupts(USB_OTG_GlobalTypeDef const *USBx) +{ + uint32_t tmpreg; + + tmpreg = USBx->GINTSTS; + tmpreg &= USBx->GINTMSK; + + return tmpreg; +} + +/** + * @brief USB_ReadChInterrupts: return USB channel interrupt status + * @param USBx Selected device + * @param chnum Channel number + * @retval USB Channel Interrupt status + */ +uint32_t USB_ReadChInterrupts(const USB_OTG_GlobalTypeDef *USBx, uint8_t chnum) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_HC(chnum)->HCINT; + tmpreg &= USBx_HC(chnum)->HCINTMSK; + + return tmpreg; +} + +/** + * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status + * @param USBx Selected device + * @retval USB Device OUT EP interrupt status + */ +uint32_t USB_ReadDevAllOutEpInterrupt(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_DEVICE->DAINT; + tmpreg &= USBx_DEVICE->DAINTMSK; + + return ((tmpreg & 0xffff0000U) >> 16); +} + +/** + * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status + * @param USBx Selected device + * @retval USB Device IN EP interrupt status + */ +uint32_t USB_ReadDevAllInEpInterrupt(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_DEVICE->DAINT; + tmpreg &= USBx_DEVICE->DAINTMSK; + + return ((tmpreg & 0xFFFFU)); +} + +/** + * @brief Returns Device OUT EP Interrupt register + * @param USBx Selected device + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device OUT EP Interrupt register + */ +uint32_t USB_ReadDevOutEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + + tmpreg = USBx_OUTEP((uint32_t)epnum)->DOEPINT; + tmpreg &= USBx_DEVICE->DOEPMSK; + + return tmpreg; +} + +/** + * @brief Returns Device IN EP Interrupt register + * @param USBx Selected device + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device IN EP Interrupt register + */ +uint32_t USB_ReadDevInEPInterrupt(const USB_OTG_GlobalTypeDef *USBx, uint8_t epnum) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t tmpreg; + uint32_t msk; + uint32_t emp; + + msk = USBx_DEVICE->DIEPMSK; + emp = USBx_DEVICE->DIEPEMPMSK; + msk |= ((emp >> (epnum & EP_ADDR_MSK)) & 0x1U) << 7; + tmpreg = USBx_INEP((uint32_t)epnum)->DIEPINT & msk; + + return tmpreg; +} + +/** + * @brief USB_ClearInterrupts: clear a USB interrupt + * @param USBx Selected device + * @param interrupt flag + * @retval None + */ +void USB_ClearInterrupts(USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt) +{ + USBx->GINTSTS &= interrupt; +} + +/** + * @brief Returns USB core mode + * @param USBx Selected device + * @retval return core mode : Host or Device + * This parameter can be one of these values: + * 0 : Host + * 1 : Device + */ +uint32_t USB_GetMode(const USB_OTG_GlobalTypeDef *USBx) +{ + return ((USBx->GINTSTS) & 0x1U); +} + +/** + * @brief Activate EP0 for Setup transactions + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateSetup(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + /* Set the MPS of the IN EP0 to 64 bytes */ + USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; + + USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; + + return HAL_OK; +} + +/** + * @brief Prepare the EP0 to start the first control setup + * @param USBx Selected device + * @param psetup pointer to setup packet + * @retval HAL status + */ +HAL_StatusTypeDef USB_EP0_OutStart(const USB_OTG_GlobalTypeDef *USBx, const uint8_t *psetup) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t gSNPSiD = *(__IO const uint32_t *)(&USBx->CID + 0x1U); + UNUSED(psetup); + + if (gSNPSiD > USB_OTG_CORE_ID_300A) + { + if ((USBx_OUTEP(0U)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + return HAL_OK; + } + } + + USBx_OUTEP(0U)->DOEPTSIZ = 0U; + USBx_OUTEP(0U)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1U << 19)); + USBx_OUTEP(0U)->DOEPTSIZ |= (3U * 8U); + USBx_OUTEP(0U)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT; + + return HAL_OK; +} + +/** + * @brief Reset the USB Core (needed after USB clock settings change) + * @param USBx Selected device + * @retval HAL status + */ +static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) +{ + __IO uint32_t count = 0U; + + /* Wait for AHB master IDLE state. */ + do + { + count++; + + if (count > HAL_USB_TIMEOUT) + { + return HAL_TIMEOUT; + } + } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0U); + + /* Core Soft Reset */ + count = 0U; + USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; + + do + { + count++; + + if (count > HAL_USB_TIMEOUT) + { + return HAL_TIMEOUT; + } + } while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); + + return HAL_OK; +} + +/** + * @brief USB_HostInit : Initializes the USB OTG controller registers + * for Host mode + * @param USBx Selected device + * @param cfg pointer to a USB_OTG_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t i; + + /* Restart the Phy Clock */ + USBx_PCGCCTL = 0U; + + /* Disable VBUS sensing */ + USBx->GCCFG &= ~(USB_OTG_GCCFG_VBUSASEN); + USBx->GCCFG &= ~(USB_OTG_GCCFG_VBUSBSEN); + /* Set default Max speed support */ + USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); + + /* Make sure the FIFOs are flushed. */ + if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ + { + ret = HAL_ERROR; + } + + if (USB_FlushRxFifo(USBx) != HAL_OK) + { + ret = HAL_ERROR; + } + + /* Clear all pending HC Interrupts */ + for (i = 0U; i < cfg.Host_channels; i++) + { + USBx_HC(i)->HCINT = CLEAR_INTERRUPT_MASK; + USBx_HC(i)->HCINTMSK = 0U; + } + + /* Disable all interrupts. */ + USBx->GINTMSK = 0U; + + /* Clear any pending interrupts */ + USBx->GINTSTS = CLEAR_INTERRUPT_MASK; + + /* set Rx FIFO size */ + USBx->GRXFSIZ = 0x80U; + USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((0x60U << 16) & USB_OTG_NPTXFD) | 0x80U); + USBx->HPTXFSIZ = (uint32_t)(((0x40U << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0U); + /* Enable the common interrupts */ + USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; + + /* Enable interrupts matching to the Host mode ONLY */ + USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM | \ + USB_OTG_GINTMSK_SOFM | USB_OTG_GINTSTS_DISCINT | \ + USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); + + return ret; +} + +/** + * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the + * HCFG register on the PHY type and set the right frame interval + * @param USBx Selected device + * @param freq clock frequency + * This parameter can be one of these values: + * HCFG_48_MHZ : Full Speed 48 MHz Clock + * HCFG_6_MHZ : Low Speed 6 MHz Clock + * @retval HAL status + */ +HAL_StatusTypeDef USB_InitFSLSPClkSel(const USB_OTG_GlobalTypeDef *USBx, uint8_t freq) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS); + USBx_HOST->HCFG |= (uint32_t)freq & USB_OTG_HCFG_FSLSPCS; + + if (freq == HCFG_48_MHZ) + { + USBx_HOST->HFIR = HFIR_48_MHZ; + } + else if (freq == HCFG_6_MHZ) + { + USBx_HOST->HFIR = HFIR_6_MHZ; + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief USB_OTG_ResetPort : Reset Host Port + * @param USBx Selected device + * @retval HAL status + * @note (1)The application must wait at least 10 ms + * before clearing the reset bit. + */ +HAL_StatusTypeDef USB_ResetPort(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0); + HAL_Delay(100U); /* See Note #1 */ + USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0); + HAL_Delay(10U); + + return HAL_OK; +} + +/** + * @brief USB_DriveVbus : activate or de-activate vbus + * @param state VBUS state + * This parameter can be one of these values: + * 0 : Deactivate VBUS + * 1 : Activate VBUS + * @retval HAL status + */ +HAL_StatusTypeDef USB_DriveVbus(const USB_OTG_GlobalTypeDef *USBx, uint8_t state) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + + hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET | + USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG); + + if (((hprt0 & USB_OTG_HPRT_PPWR) == 0U) && (state == 1U)) + { + USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0); + } + if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0U)) + { + USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0); + } + return HAL_OK; +} + +/** + * @brief Return Host Core speed + * @param USBx Selected device + * @retval speed : Host speed + * This parameter can be one of these values: + * @arg HCD_SPEED_FULL: Full speed mode + * @arg HCD_SPEED_LOW: Low speed mode + */ +uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef const *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + __IO uint32_t hprt0 = 0U; + + hprt0 = USBx_HPRT0; + return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17); +} + +/** + * @brief Return Host Current Frame number + * @param USBx Selected device + * @retval current frame number + */ +uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef const *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); +} + +/** + * @brief Initialize a host channel + * @param USBx Selected device + * @param ch_num Channel number + * This parameter can be a value from 1 to 15 + * @param epnum Endpoint number + * This parameter can be a value from 1 to 15 + * @param dev_address Current device address + * This parameter can be a value from 0 to 255 + * @param speed Current device speed + * This parameter can be one of these values: + * @arg USB_OTG_SPEED_FULL: Full speed mode + * @arg USB_OTG_SPEED_LOW: Low speed mode + * @param ep_type Endpoint Type + * This parameter can be one of these values: + * @arg EP_TYPE_CTRL: Control type + * @arg EP_TYPE_ISOC: Isochronous type + * @arg EP_TYPE_BULK: Bulk type + * @arg EP_TYPE_INTR: Interrupt type + * @param mps Max Packet Size + * This parameter can be a value from 0 to 32K + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t HCcharEpDir; + uint32_t HCcharLowSpeed; + uint32_t HostCoreSpeed; + + /* Clear old interrupt conditions for this host channel. */ + USBx_HC((uint32_t)ch_num)->HCINT = CLEAR_INTERRUPT_MASK; + + /* Enable channel interrupts required for this transfer. */ + switch (ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | + USB_OTG_HCINTMSK_STALLM | + USB_OTG_HCINTMSK_TXERRM | + USB_OTG_HCINTMSK_DTERRM | + USB_OTG_HCINTMSK_AHBERR | + USB_OTG_HCINTMSK_NAKM; + + if ((epnum & 0x80U) == 0x80U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; + } + break; + + case EP_TYPE_INTR: + USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | + USB_OTG_HCINTMSK_STALLM | + USB_OTG_HCINTMSK_TXERRM | + USB_OTG_HCINTMSK_DTERRM | + USB_OTG_HCINTMSK_NAKM | + USB_OTG_HCINTMSK_AHBERR | + USB_OTG_HCINTMSK_FRMORM; + + if ((epnum & 0x80U) == 0x80U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; + } + + break; + + case EP_TYPE_ISOC: + USBx_HC((uint32_t)ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM | + USB_OTG_HCINTMSK_ACKM | + USB_OTG_HCINTMSK_AHBERR | + USB_OTG_HCINTMSK_FRMORM; + + if ((epnum & 0x80U) == 0x80U) + { + USBx_HC((uint32_t)ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM); + } + break; + + default: + ret = HAL_ERROR; + break; + } + + /* Enable host channel Halt interrupt */ + USBx_HC((uint32_t)ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM; + + /* Enable the top level host channel interrupt. */ + USBx_HOST->HAINTMSK |= 1UL << (ch_num & 0xFU); + + /* Make sure host channel interrupts are enabled. */ + USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM; + + /* Program the HCCHAR register */ + if ((epnum & 0x80U) == 0x80U) + { + HCcharEpDir = (0x1U << 15) & USB_OTG_HCCHAR_EPDIR; + } + else + { + HCcharEpDir = 0U; + } + + HostCoreSpeed = USB_GetHostSpeed(USBx); + + /* LS device plugged to HUB */ + if ((speed == HPRT0_PRTSPD_LOW_SPEED) && (HostCoreSpeed != HPRT0_PRTSPD_LOW_SPEED)) + { + HCcharLowSpeed = (0x1U << 17) & USB_OTG_HCCHAR_LSDEV; + } + else + { + HCcharLowSpeed = 0U; + } + + USBx_HC((uint32_t)ch_num)->HCCHAR = (((uint32_t)dev_address << 22) & USB_OTG_HCCHAR_DAD) | + ((((uint32_t)epnum & 0x7FU) << 11) & USB_OTG_HCCHAR_EPNUM) | + (((uint32_t)ep_type << 18) & USB_OTG_HCCHAR_EPTYP) | + ((uint32_t)mps & USB_OTG_HCCHAR_MPSIZ) | + USB_OTG_HCCHAR_MC_0 | HCcharEpDir | HCcharLowSpeed; + + if ((ep_type == EP_TYPE_INTR) || (ep_type == EP_TYPE_ISOC)) + { + USBx_HC((uint32_t)ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM; + } + + return ret; +} + +/** + * @brief Start a transfer over a host channel + * @param USBx Selected device + * @param hc pointer to host channel structure + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t ch_num = (uint32_t)hc->ch_num; + __IO uint32_t tmpreg; + uint8_t is_oddframe; + uint16_t len_words; + uint16_t num_packets; + uint16_t max_hc_pkt_count = HC_MAX_PKT_CNT; + + /* Compute the expected number of packets associated to the transfer */ + if (hc->xfer_len > 0U) + { + num_packets = (uint16_t)((hc->xfer_len + hc->max_packet - 1U) / hc->max_packet); + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + hc->XferSize = (uint32_t)num_packets * hc->max_packet; + } + } + else + { + num_packets = 1U; + } + + /* + * For IN channel HCTSIZ.XferSize is expected to be an integer multiple of + * max_packet size. + */ + if (hc->ep_is_in != 0U) + { + hc->XferSize = (uint32_t)num_packets * hc->max_packet; + } + else + { + hc->XferSize = hc->xfer_len; + } + + /* Initialize the HCTSIZn register */ + USBx_HC(ch_num)->HCTSIZ = (hc->XferSize & USB_OTG_HCTSIZ_XFRSIZ) | + (((uint32_t)num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | + (((uint32_t)hc->data_pid << 29) & USB_OTG_HCTSIZ_DPID); + + is_oddframe = (((uint32_t)USBx_HOST->HFNUM & 0x01U) != 0U) ? 0U : 1U; + USBx_HC(ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; + USBx_HC(ch_num)->HCCHAR |= (uint32_t)is_oddframe << 29; + + /* Set host channel enable */ + tmpreg = USBx_HC(ch_num)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + + /* make sure to set the correct ep direction */ + if (hc->ep_is_in != 0U) + { + tmpreg |= USB_OTG_HCCHAR_EPDIR; + } + else + { + tmpreg &= ~USB_OTG_HCCHAR_EPDIR; + } + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(ch_num)->HCCHAR = tmpreg; + + if ((hc->ep_is_in == 0U) && (hc->xfer_len > 0U)) + { + switch (hc->ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); + + /* check if there is enough space in FIFO space */ + if (len_words > (USBx->HNPTXSTS & 0xFFFFU)) + { + /* need to process data in nptxfempty interrupt */ + USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM; + } + break; + + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + len_words = (uint16_t)((hc->xfer_len + 3U) / 4U); + /* check if there is enough space in FIFO space */ + if (len_words > (USBx_HOST->HPTXSTS & 0xFFFFU)) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM; + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + (void)USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, (uint16_t)hc->xfer_len); + } + + return HAL_OK; +} + +/** + * @brief Read all host channel interrupts status + * @param USBx Selected device + * @retval HAL state + */ +uint32_t USB_HC_ReadInterrupt(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + return ((USBx_HOST->HAINT) & 0xFFFFU); +} + +/** + * @brief Halt a host channel + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @retval HAL state + */ +HAL_StatusTypeDef USB_HC_Halt(const USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t hcnum = (uint32_t)hc_num; + __IO uint32_t count = 0U; + uint32_t HcEpType = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_EPTYP) >> 18; + uint32_t ChannelEna = (USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) >> 31; + uint32_t SplitEna = (USBx_HC(hcnum)->HCSPLT & USB_OTG_HCSPLT_SPLITEN) >> 31; + + /* In buffer DMA, Channel disable must not be programmed for non-split periodic channels. + At the end of the next uframe/frame (in the worst case), the core generates a channel halted + and disables the channel automatically. */ + + if ((((USBx->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == USB_OTG_GAHBCFG_DMAEN) && (SplitEna == 0U)) && + ((ChannelEna == 0U) || (((HcEpType == HCCHAR_ISOC) || (HcEpType == HCCHAR_INTR))))) + { + return HAL_OK; + } + + /* Check for space in the request queue to issue the halt. */ + if ((HcEpType == HCCHAR_CTRL) || (HcEpType == HCCHAR_BULK)) + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; + + if ((USBx->GAHBCFG & USB_OTG_GAHBCFG_DMAEN) == 0U) + { + if ((USBx->HNPTXSTS & (0xFFU << 16)) == 0U) + { + USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + do + { + count++; + + if (count > 1000U) + { + break; + } + } while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + } + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + } + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; + + if ((USBx_HOST->HPTXSTS & (0xFFU << 16)) == 0U) + { + USBx_HC(hcnum)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + do + { + count++; + + if (count > 1000U) + { + break; + } + } while ((USBx_HC(hcnum)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + else + { + USBx_HC(hcnum)->HCCHAR |= USB_OTG_HCCHAR_CHENA; + } + } + + return HAL_OK; +} + +/** + * @brief Initiate Do Ping protocol + * @param USBx Selected device + * @param hc_num Host Channel number + * This parameter can be a value from 1 to 15 + * @retval HAL state + */ +HAL_StatusTypeDef USB_DoPing(const USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + uint32_t chnum = (uint32_t)ch_num; + uint32_t num_packets = 1U; + uint32_t tmpreg; + + USBx_HC(chnum)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) | + USB_OTG_HCTSIZ_DOPING; + + /* Set host channel enable */ + tmpreg = USBx_HC(chnum)->HCCHAR; + tmpreg &= ~USB_OTG_HCCHAR_CHDIS; + tmpreg |= USB_OTG_HCCHAR_CHENA; + USBx_HC(chnum)->HCCHAR = tmpreg; + + return HAL_OK; +} + +/** + * @brief Stop Host Core + * @param USBx Selected device + * @retval HAL state + */ +HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint32_t USBx_BASE = (uint32_t)USBx; + __IO uint32_t count = 0U; + uint32_t value; + uint32_t i; + + (void)USB_DisableGlobalInt(USBx); + + /* Flush USB FIFO */ + if (USB_FlushTxFifo(USBx, 0x10U) != HAL_OK) /* all Tx FIFOs */ + { + ret = HAL_ERROR; + } + + if (USB_FlushRxFifo(USBx) != HAL_OK) + { + ret = HAL_ERROR; + } + + /* Flush out any leftover queued requests. */ + for (i = 0U; i <= 15U; i++) + { + value = USBx_HC(i)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value &= ~USB_OTG_HCCHAR_CHENA; + value &= ~USB_OTG_HCCHAR_EPDIR; + USBx_HC(i)->HCCHAR = value; + } + + /* Halt all channels to put them into a known state. */ + for (i = 0U; i <= 15U; i++) + { + value = USBx_HC(i)->HCCHAR; + value |= USB_OTG_HCCHAR_CHDIS; + value |= USB_OTG_HCCHAR_CHENA; + value &= ~USB_OTG_HCCHAR_EPDIR; + USBx_HC(i)->HCCHAR = value; + + do + { + count++; + + if (count > 1000U) + { + break; + } + } while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); + } + + /* Clear any pending Host interrupts */ + USBx_HOST->HAINT = CLEAR_INTERRUPT_MASK; + USBx->GINTSTS = CLEAR_INTERRUPT_MASK; + + (void)USB_EnableGlobalInt(USBx); + + return ret; +} + +/** + * @brief USB_ActivateRemoteWakeup active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) + { + /* active Remote wakeup signalling */ + USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG; + } + + return HAL_OK; +} + +/** + * @brief USB_DeActivateRemoteWakeup de-active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(const USB_OTG_GlobalTypeDef *USBx) +{ + uint32_t USBx_BASE = (uint32_t)USBx; + + /* active Remote wakeup signalling */ + USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG); + + return HAL_OK; +} +#endif /* defined (USB_OTG_FS) */ + +#if defined (USB) +/** + * @brief Initializes the USB Core + * @param USBx USB Instance + * @param cfg pointer to a USB_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_CoreInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(cfg); + + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + + return HAL_OK; +} + +/** + * @brief USB_EnableGlobalInt + * Enables the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_EnableGlobalInt(USB_TypeDef *USBx) +{ + uint32_t winterruptmask; + + /* Clear pending interrupts */ + USBx->ISTR = 0U; + + /* Set winterruptmask variable */ + winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | + USB_CNTR_SUSPM | USB_CNTR_ERRM | + USB_CNTR_SOFM | USB_CNTR_ESOFM | + USB_CNTR_RESETM; + + /* Set interrupt mask */ + USBx->CNTR = (uint16_t)winterruptmask; + + return HAL_OK; +} + +/** + * @brief USB_DisableGlobalInt + * Disable the controller's Global Int in the AHB Config reg + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DisableGlobalInt(USB_TypeDef *USBx) +{ + uint32_t winterruptmask; + + /* Set winterruptmask variable */ + winterruptmask = USB_CNTR_CTRM | USB_CNTR_WKUPM | + USB_CNTR_SUSPM | USB_CNTR_ERRM | + USB_CNTR_SOFM | USB_CNTR_ESOFM | + USB_CNTR_RESETM; + + /* Clear interrupt mask */ + USBx->CNTR &= (uint16_t)(~winterruptmask); + + return HAL_OK; +} + +/** + * @brief USB_SetCurrentMode Set functional mode + * @param USBx Selected device + * @param mode current core mode + * This parameter can be one of the these values: + * @arg USB_DEVICE_MODE Peripheral mode + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetCurrentMode(USB_TypeDef *USBx, USB_ModeTypeDef mode) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(mode); + + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + return HAL_OK; +} + +/** + * @brief USB_DevInit Initializes the USB controller registers + * for device mode + * @param USBx Selected device + * @param cfg pointer to a USB_CfgTypeDef structure that contains + * the configuration information for the specified USBx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevInit(USB_TypeDef *USBx, USB_CfgTypeDef cfg) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(cfg); + + /* Init Device */ + /* CNTR_FRES = 1 */ + USBx->CNTR = (uint16_t)USB_CNTR_FRES; + + /* CNTR_FRES = 0 */ + USBx->CNTR = 0U; + + /* Clear pending interrupts */ + USBx->ISTR = 0U; + + /*Set Btable Address*/ + USBx->BTABLE = BTABLE_ADDRESS; + + return HAL_OK; +} + +/** + * @brief USB_FlushTxFifo : Flush a Tx FIFO + * @param USBx : Selected device + * @param num : FIFO number + * This parameter can be a value from 1 to 15 + 15 means Flush all Tx FIFOs + * @retval HAL status + */ +HAL_StatusTypeDef USB_FlushTxFifo(USB_TypeDef const *USBx, uint32_t num) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(num); + + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + + return HAL_OK; +} + +/** + * @brief USB_FlushRxFifo : Flush Rx FIFO + * @param USBx : Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_FlushRxFifo(USB_TypeDef const *USBx) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + + return HAL_OK; +} + + +#if defined (HAL_PCD_MODULE_ENABLED) +/** + * @brief Activate and configure an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep) +{ + HAL_StatusTypeDef ret = HAL_OK; + uint16_t wEpRegVal; + + wEpRegVal = PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_T_MASK; + + /* initialize Endpoint */ + switch (ep->type) + { + case EP_TYPE_CTRL: + wEpRegVal |= USB_EP_CONTROL; + break; + + case EP_TYPE_BULK: + wEpRegVal |= USB_EP_BULK; + break; + + case EP_TYPE_INTR: + wEpRegVal |= USB_EP_INTERRUPT; + break; + + case EP_TYPE_ISOC: + wEpRegVal |= USB_EP_ISOCHRONOUS; + break; + + default: + ret = HAL_ERROR; + break; + } + + PCD_SET_ENDPOINT(USBx, ep->num, (wEpRegVal | USB_EP_CTR_RX | USB_EP_CTR_TX)); + + PCD_SET_EP_ADDRESS(USBx, ep->num, ep->num); + + if (ep->doublebuffer == 0U) + { + if (ep->is_in != 0U) + { + /*Set the endpoint Transmit buffer address */ + PCD_SET_EP_TX_ADDRESS(USBx, ep->num, ep->pmaadress); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + else + { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + } + else + { + /* Set the endpoint Receive buffer address */ + PCD_SET_EP_RX_ADDRESS(USBx, ep->num, ep->pmaadress); + + /* Set the endpoint Receive buffer counter */ + PCD_SET_EP_RX_CNT(USBx, ep->num, ep->maxpacket); + PCD_CLEAR_RX_DTOG(USBx, ep->num); + + if (ep->num == 0U) + { + /* Configure VALID status for EP0 */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + } + else + { + /* Configure NAK status for OUT Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_NAK); + } + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + /* Double Buffer */ + else + { + if (ep->type == EP_TYPE_BULK) + { + /* Set bulk endpoint as double buffered */ + PCD_SET_BULK_EP_DBUF(USBx, ep->num); + } + else + { + /* Set the ISOC endpoint in double buffer mode */ + PCD_CLEAR_EP_KIND(USBx, ep->num); + } + + /* Set buffer address for double buffered mode */ + PCD_SET_EP_DBUF_ADDR(USBx, ep->num, ep->pmaaddr0, ep->pmaaddr1); + + if (ep->is_in == 0U) + { + /* Clear the data toggle bits for the endpoint IN/OUT */ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + else + { + /* Clear the data toggle bits for the endpoint IN/OUT */ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + else + { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + return ret; +} + +/** + * @brief De-activate and de-initialize an endpoint + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeactivateEndpoint(USB_TypeDef *USBx, USB_EPTypeDef *ep) +{ + if (ep->doublebuffer == 0U) + { + if (ep->is_in != 0U) + { + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + /* Configure DISABLE status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + + else + { + PCD_CLEAR_RX_DTOG(USBx, ep->num); + + /* Configure DISABLE status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + /* Double Buffer */ + else + { + if (ep->is_in == 0U) + { + /* Clear the data toggle bits for the endpoint IN/OUT*/ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + /* Reset value of the data toggle bits for the endpoint out*/ + PCD_TX_DTOG(USBx, ep->num); + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + else + { + /* Clear the data toggle bits for the endpoint IN/OUT*/ + PCD_CLEAR_RX_DTOG(USBx, ep->num); + PCD_CLEAR_TX_DTOG(USBx, ep->num); + PCD_RX_DTOG(USBx, ep->num); + + /* Configure DISABLE status for the Endpoint*/ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + return HAL_OK; +} + +/** + * @brief USB_EPStartXfer setup and starts a transfer over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStartXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep) +{ + uint32_t len; +#if (USE_USB_DOUBLE_BUFFER == 1U) + uint16_t pmabuffer; + uint16_t wEPVal; +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + /* IN endpoint */ + if (ep->is_in == 1U) + { + /*Multi packet transfer*/ + if (ep->xfer_len > ep->maxpacket) + { + len = ep->maxpacket; + } + else + { + len = ep->xfer_len; + } + + /* configure and validate Tx endpoint */ + if (ep->doublebuffer == 0U) + { + USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, (uint16_t)len); + PCD_SET_EP_TX_CNT(USBx, ep->num, len); + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else + { + /* double buffer bulk management */ + if (ep->type == EP_TYPE_BULK) + { + if (ep->xfer_len_db > ep->maxpacket) + { + /* enable double buffer */ + PCD_SET_BULK_EP_DBUF(USBx, ep->num); + + /* each Time to write in PMA xfer_len_db will */ + ep->xfer_len_db -= len; + + /* Fill the two first buffer in the Buffer0 & Buffer1 */ + if ((PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_DTOG_TX) != 0U) + { + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr1; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + ep->xfer_buff += len; + + if (ep->xfer_len_db > ep->maxpacket) + { + ep->xfer_len_db -= len; + } + else + { + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + } + + /* Set the Double buffer counter for pmabuffer0 */ + PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + else + { + /* Set the Double buffer counter for pmabuffer0 */ + PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + ep->xfer_buff += len; + + if (ep->xfer_len_db > ep->maxpacket) + { + ep->xfer_len_db -= len; + } + else + { + len = ep->xfer_len_db; + ep->xfer_len_db = 0U; + } + + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr1; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + } + /* auto Switch to single buffer mode when transfer xfer_len_db; + + /* disable double buffer mode for Bulk endpoint */ + PCD_CLEAR_BULK_EP_DBUF(USBx, ep->num); + + /* Set Tx count with nbre of byte to be transmitted */ + PCD_SET_EP_TX_CNT(USBx, ep->num, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + } + else /* manage isochronous double buffer IN mode */ + { + /* each Time to write in PMA xfer_len_db will */ + ep->xfer_len_db -= len; + + /* Fill the data buffer */ + if ((PCD_GET_ENDPOINT(USBx, ep->num) & USB_EP_DTOG_TX) != 0U) + { + /* Set the Double buffer counter for pmabuffer1 */ + PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr1; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + else + { + /* Set the Double buffer counter for pmabuffer0 */ + PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len); + pmabuffer = ep->pmaaddr0; + + /* Write the user buffer to USB PMA */ + USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len); + } + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID); + } + else /* OUT endpoint */ + { + if (ep->doublebuffer == 0U) + { + /* Multi packet transfer */ + if (ep->xfer_len > ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len -= len; + } + else + { + len = ep->xfer_len; + ep->xfer_len = 0U; + } + /* configure and validate Rx endpoint */ + PCD_SET_EP_RX_CNT(USBx, ep->num, len); + } +#if (USE_USB_DOUBLE_BUFFER == 1U) + else + { + /* First Transfer Coming From HAL_PCD_EP_Receive & From ISR */ + /* Set the Double buffer counter */ + if (ep->type == EP_TYPE_BULK) + { + PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, ep->maxpacket); + + /* Coming from ISR */ + if (ep->xfer_count != 0U) + { + /* update last value to check if there is blocking state */ + wEPVal = PCD_GET_ENDPOINT(USBx, ep->num); + + /*Blocking State */ + if ((((wEPVal & USB_EP_DTOG_RX) != 0U) && ((wEPVal & USB_EP_DTOG_TX) != 0U)) || + (((wEPVal & USB_EP_DTOG_RX) == 0U) && ((wEPVal & USB_EP_DTOG_TX) == 0U))) + { + PCD_FREE_USER_BUFFER(USBx, ep->num, 0U); + } + } + } + /* iso out double */ + else if (ep->type == EP_TYPE_ISOC) + { + /* Multi packet transfer */ + if (ep->xfer_len > ep->maxpacket) + { + len = ep->maxpacket; + ep->xfer_len -= len; + } + else + { + len = ep->xfer_len; + ep->xfer_len = 0U; + } + PCD_SET_EP_DBUF_CNT(USBx, ep->num, ep->is_in, len); + } + else + { + return HAL_ERROR; + } + } +#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */ + + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + } + + return HAL_OK; +} + + +/** + * @brief USB_EPSetStall set a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPSetStall(USB_TypeDef *USBx, USB_EPTypeDef *ep) +{ + if (ep->is_in != 0U) + { + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_STALL); + } + else + { + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_STALL); + } + + return HAL_OK; +} + +/** + * @brief USB_EPClearStall Clear a stall condition over an EP + * @param USBx Selected device + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPClearStall(USB_TypeDef *USBx, USB_EPTypeDef *ep) +{ + if (ep->doublebuffer == 0U) + { + if (ep->is_in != 0U) + { + PCD_CLEAR_TX_DTOG(USBx, ep->num); + + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + } + else + { + PCD_CLEAR_RX_DTOG(USBx, ep->num); + + /* Configure VALID status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID); + } + } + + return HAL_OK; +} + +/** + * @brief USB_EPStoptXfer Stop transfer on an EP + * @param USBx usb device instance + * @param ep pointer to endpoint structure + * @retval HAL status + */ +HAL_StatusTypeDef USB_EPStopXfer(USB_TypeDef *USBx, USB_EPTypeDef *ep) +{ + /* IN endpoint */ + if (ep->is_in == 1U) + { + if (ep->doublebuffer == 0U) + { + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK); + } + else + { + /* Configure TX Endpoint to disabled state */ + PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS); + } + } + } + else /* OUT endpoint */ + { + if (ep->doublebuffer == 0U) + { + if (ep->type != EP_TYPE_ISOC) + { + /* Configure NAK status for the Endpoint */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_NAK); + } + else + { + /* Configure RX Endpoint to disabled state */ + PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS); + } + } + } + + return HAL_OK; +} +#endif /* defined (HAL_PCD_MODULE_ENABLED) */ + +/** + * @brief USB_StopDevice Stop the usb device mode + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_StopDevice(USB_TypeDef *USBx) +{ + /* disable all interrupts and force USB reset */ + USBx->CNTR = (uint16_t)USB_CNTR_FRES; + + /* clear interrupt status register */ + USBx->ISTR = 0U; + + /* switch-off device */ + USBx->CNTR = (uint16_t)(USB_CNTR_FRES | USB_CNTR_PDWN); + + return HAL_OK; +} + +/** + * @brief USB_SetDevAddress Stop the usb device mode + * @param USBx Selected device + * @param address new device address to be assigned + * This parameter can be a value from 0 to 255 + * @retval HAL status + */ +HAL_StatusTypeDef USB_SetDevAddress(USB_TypeDef *USBx, uint8_t address) +{ + if (address == 0U) + { + /* set device address and enable function */ + USBx->DADDR = (uint16_t)USB_DADDR_EF; + } + + return HAL_OK; +} + +/** + * @brief USB_DevConnect Connect the USB device by enabling the pull-up/pull-down + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevConnect(USB_TypeDef *USBx) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + + return HAL_OK; +} + +/** + * @brief USB_DevDisconnect Disconnect the USB device by disabling the pull-up/pull-down + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DevDisconnect(USB_TypeDef *USBx) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + + return HAL_OK; +} + +/** + * @brief USB_ReadInterrupts return the global USB interrupt status + * @param USBx Selected device + * @retval USB Global Interrupt status + */ +uint32_t USB_ReadInterrupts(USB_TypeDef const *USBx) +{ + uint32_t tmpreg; + + tmpreg = USBx->ISTR; + return tmpreg; +} + +/** + * @brief USB_ReadDevAllOutEpInterrupt return the USB device OUT endpoints interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadDevAllOutEpInterrupt(USB_TypeDef *USBx) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + return (0); +} + +/** + * @brief USB_ReadDevAllInEpInterrupt return the USB device IN endpoints interrupt status + * @param USBx Selected device + * @retval HAL status + */ +uint32_t USB_ReadDevAllInEpInterrupt(USB_TypeDef *USBx) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + return (0); +} + +/** + * @brief Returns Device OUT EP Interrupt register + * @param USBx Selected device + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device OUT EP Interrupt register + */ +uint32_t USB_ReadDevOutEPInterrupt(USB_TypeDef *USBx, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(epnum); + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + return (0); +} + +/** + * @brief Returns Device IN EP Interrupt register + * @param USBx Selected device + * @param epnum endpoint number + * This parameter can be a value from 0 to 15 + * @retval Device IN EP Interrupt register + */ +uint32_t USB_ReadDevInEPInterrupt(USB_TypeDef *USBx, uint8_t epnum) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(epnum); + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + return (0); +} + +/** + * @brief USB_ClearInterrupts: clear a USB interrupt + * @param USBx Selected device + * @param interrupt flag + * @retval None + */ +void USB_ClearInterrupts(USB_TypeDef *USBx, uint32_t interrupt) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(interrupt); + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ +} + +/** + * @brief Prepare the EP0 to start the first control setup + * @param USBx Selected device + * @param psetup pointer to setup packet + * @retval HAL status + */ +HAL_StatusTypeDef USB_EP0_OutStart(USB_TypeDef *USBx, uint8_t *psetup) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(USBx); + UNUSED(psetup); + /* NOTE : - This function is not required by USB Device FS peripheral, it is used + only by USB OTG FS peripheral. + - This function is added to ensure compatibility across platforms. + */ + return HAL_OK; +} + +/** + * @brief USB_ActivateRemoteWakeup : active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_ActivateRemoteWakeup(USB_TypeDef *USBx) +{ + USBx->CNTR |= (uint16_t)USB_CNTR_RESUME; + + return HAL_OK; +} + +/** + * @brief USB_DeActivateRemoteWakeup de-active remote wakeup signalling + * @param USBx Selected device + * @retval HAL status + */ +HAL_StatusTypeDef USB_DeActivateRemoteWakeup(USB_TypeDef *USBx) +{ + USBx->CNTR &= (uint16_t)(~USB_CNTR_RESUME); + + return HAL_OK; +} + +/** + * @brief Copy a buffer from user memory area to packet memory area (PMA) + * @param USBx USB peripheral instance register address. + * @param pbUsrBuf pointer to user memory area. + * @param wPMABufAddr address into PMA. + * @param wNBytes no. of bytes to be copied. + * @retval None + */ +void USB_WritePMA(USB_TypeDef const *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = ((uint32_t)wNBytes + 1U) >> 1; + uint32_t BaseAddr = (uint32_t)USBx; + uint32_t count; + uint16_t WrVal; + __IO uint16_t *pdwVal; + uint8_t *pBuf = pbUsrBuf; + + pdwVal = (__IO uint16_t *)(BaseAddr + 0x400U + ((uint32_t)wPMABufAddr * PMA_ACCESS)); + + for (count = n; count != 0U; count--) + { + WrVal = pBuf[0]; + WrVal |= (uint16_t)pBuf[1] << 8; + *pdwVal = (WrVal & 0xFFFFU); + pdwVal++; + +#if PMA_ACCESS > 1U + pdwVal++; +#endif /* PMA_ACCESS */ + + pBuf++; + pBuf++; + } +} + +/** + * @brief Copy data from packet memory area (PMA) to user memory buffer + * @param USBx USB peripheral instance register address. + * @param pbUsrBuf pointer to user memory area. + * @param wPMABufAddr address into PMA. + * @param wNBytes no. of bytes to be copied. + * @retval None + */ +void USB_ReadPMA(USB_TypeDef const *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes) +{ + uint32_t n = (uint32_t)wNBytes >> 1; + uint32_t BaseAddr = (uint32_t)USBx; + uint32_t count; + uint32_t RdVal; + __IO uint16_t *pdwVal; + uint8_t *pBuf = pbUsrBuf; + + pdwVal = (__IO uint16_t *)(BaseAddr + 0x400U + ((uint32_t)wPMABufAddr * PMA_ACCESS)); + + for (count = n; count != 0U; count--) + { + RdVal = *(__IO uint16_t *)pdwVal; + pdwVal++; + *pBuf = (uint8_t)((RdVal >> 0) & 0xFFU); + pBuf++; + *pBuf = (uint8_t)((RdVal >> 8) & 0xFFU); + pBuf++; + +#if PMA_ACCESS > 1U + pdwVal++; +#endif /* PMA_ACCESS */ + } + + if ((wNBytes % 2U) != 0U) + { + RdVal = *pdwVal; + *pBuf = (uint8_t)((RdVal >> 0) & 0xFFU); + } +} + +#endif /* defined (USB) */ +/** + * @} + */ + +/** + * @} + */ +#endif /* defined (USB) || defined (USB_OTG_FS) */ +#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */ + +/** + * @} + */ diff --git a/arcadestick_software/LICENSE b/arcadestick_software/LICENSE new file mode 100644 index 0000000..54af820 --- /dev/null +++ b/arcadestick_software/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ERTOtech + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usbd_hid.h b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usbd_hid.h new file mode 100644 index 0000000..88007a0 --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usbd_hid.h @@ -0,0 +1,142 @@ +/** + ****************************************************************************** + * @file usbd_hid.h + * @author MCD Application Team + * @brief Header file for the usbd_hid_core.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_HID_H +#define __USB_HID_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_HID + * @brief This file is the Header file for usbd_hid.c + * @{ + */ + + +/** @defgroup USBD_HID_Exported_Defines + * @{ + */ +#define HID_EPIN_ADDR 0x81U +#define HID_EPIN_SIZE 0x03U +#define USB_HID_CONFIG_DESC_SIZ 34U +#define USB_HID_DESC_SIZ 9U +#define HID_MOUSE_REPORT_DESC_SIZE 56U +#define HID_DESCRIPTOR_TYPE 0x21U +#define HID_REPORT_DESC 0x22U + +#ifndef HID_HS_BINTERVAL +#define HID_HS_BINTERVAL 0x07U +#endif /* HID_HS_BINTERVAL */ + +#ifndef HID_FS_BINTERVAL +#define HID_FS_BINTERVAL 0x0AU +#endif /* HID_FS_BINTERVAL */ + +#define HID_REQ_SET_PROTOCOL 0x0BU +#define HID_REQ_GET_PROTOCOL 0x03U + +#define HID_REQ_SET_IDLE 0x0AU +#define HID_REQ_GET_IDLE 0x02U + +#define HID_REQ_SET_REPORT 0x09U +#define HID_REQ_GET_REPORT 0x01U +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ +typedef enum +{ + HID_IDLE = 0, + HID_BUSY, +} +HID_StateTypeDef; + + +typedef struct +{ + uint32_t Protocol; + uint32_t IdleState; + uint32_t AltSetting; + HID_StateTypeDef state; +} +USBD_HID_HandleTypeDef; +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_ClassTypeDef USBD_HID; +#define USBD_HID_CLASS &USBD_HID +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len); + +uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_HID_H */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c new file mode 100644 index 0000000..a3586e1 --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c @@ -0,0 +1,672 @@ +/** + ****************************************************************************** + * @file usbd_hid.c + * @author MCD Application Team + * @brief This file provides the HID core functions. + * + * @verbatim + * + * =================================================================== + * HID Class Description + * =================================================================== + * This module manages the HID class V1.11 following the "Device Class Definition + * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". + * This driver implements the following aspects of the specification: + * - The Boot Interface Subclass + * - The Mouse protocol + * - Usage Page : Generic Desktop + * - Usage : Joystick + * - Collection : Application + * + * @note In HS mode and when the DMA is used, all variables and data structures + * dealing with the DMA during the transaction process should be 32-bit aligned. + * + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_hid.h" +#include "usbd_ctlreq.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_HID + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_HID_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_HID_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_HID_Private_Macros + * @{ + */ +/** + * @} + */ + + + + +/** @defgroup USBD_HID_Private_FunctionPrototypes + * @{ + */ + + +static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_HID_DeInit(USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_HID_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length); + +static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length); + +static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length); + +static uint8_t *USBD_HID_GetDeviceQualifierDesc(uint16_t *length); + +static uint8_t USBD_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +/** + * @} + */ + +/** @defgroup USBD_HID_Private_Variables + * @{ + */ + +USBD_ClassTypeDef USBD_HID = +{ + USBD_HID_Init, + USBD_HID_DeInit, + USBD_HID_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ + USBD_HID_DataIn, /*DataIn*/ + NULL, /*DataOut*/ + NULL, /*SOF */ + NULL, + NULL, + USBD_HID_GetHSCfgDesc, + USBD_HID_GetFSCfgDesc, + USBD_HID_GetOtherSpeedCfgDesc, + USBD_HID_GetDeviceQualifierDesc, +}; + +/* USB HID device FS Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_CfgFSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_HID_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + 0x00, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x01, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + + HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */ + 0x00, + HID_FS_BINTERVAL, /*bInterval: Polling Interval */ + /* 34 */ +}; + +/* USB HID device HS Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_CfgHSDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_HID_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + 0x00, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x01, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + + HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */ + 0x00, + HID_HS_BINTERVAL, /*bInterval: Polling Interval */ + /* 34 */ +}; + +/* USB HID device Other Speed Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_OtherSpeedCfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_HID_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x01, /*bNumInterfaces: 1 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x00, /*iConfiguration: Index of string descriptor describing + the configuration*/ + 0xE0, /*bmAttributes: bus powered and Support Remote Wake-up */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + + /************** Descriptor of Joystick Mouse interface ****************/ + /* 09 */ + 0x09, /*bLength: Interface Descriptor size*/ + USB_DESC_TYPE_INTERFACE,/*bDescriptorType: Interface descriptor type*/ + 0x00, /*bInterfaceNumber: Number of Interface*/ + 0x00, /*bAlternateSetting: Alternate setting*/ + 0x01, /*bNumEndpoints*/ + 0x03, /*bInterfaceClass: HID*/ + 0x01, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/ + 0x02, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/ + 0, /*iInterface: Index of string descriptor*/ + /******************** Descriptor of Joystick Mouse HID ********************/ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, + /******************** Descriptor of Mouse endpoint ********************/ + /* 27 */ + 0x07, /*bLength: Endpoint Descriptor size*/ + USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/ + + HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/ + 0x03, /*bmAttributes: Interrupt endpoint*/ + HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */ + 0x00, + HID_FS_BINTERVAL, /*bInterval: Polling Interval */ + /* 34 */ +}; + + +/* USB HID device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END = +{ + /* 18 */ + 0x09, /*bLength: HID Descriptor size*/ + HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/ + 0x11, /*bcdHID: HID Class Spec release number*/ + 0x01, + 0x00, /*bCountryCode: Hardware target country*/ + 0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/ + 0x22, /*bDescriptorType*/ + HID_MOUSE_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/ + 0x00, +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = +{ + 0x05, 0x01, /* Usage Page (Generic Desktop) */ + 0x09, 0x05, /* Usage (Game Pad) */ + 0xA1, 0x01, /* Collection (Application) */ + + /* Hat switch (D-pad) */ + 0x05, 0x01, + 0x09, 0x39, + 0x15, 0x00, + 0x25, 0x07, + 0x35, 0x00, + 0x46, 0x3B, 0x01, + 0x65, 0x14, + 0x75, 0x04, + 0x95, 0x01, + 0x81, 0x42, + + /* Padding */ + 0x75, 0x04, + 0x95, 0x01, + 0x81, 0x03, + + /* Buttons 1..10 */ + 0x05, 0x09, + 0x19, 0x01, + 0x29, 0x0A, + 0x15, 0x00, + 0x25, 0x01, + 0x75, 0x01, + 0x95, 0x0A, + 0x81, 0x02, + + /* Padding */ + 0x75, 0x01, + 0x95, 0x06, + 0x81, 0x03, + + 0xC0 +}; + +/** + * @} + */ + +/** @defgroup USBD_HID_Private_Functions + * @{ + */ + +/** + * @brief USBD_HID_Init + * Initialize the HID interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + /* Open EP IN */ + USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE); + pdev->ep_in[HID_EPIN_ADDR & 0xFU].is_used = 1U; + + pdev->pClassData = USBD_malloc(sizeof(USBD_HID_HandleTypeDef)); + + if (pdev->pClassData == NULL) + { + return USBD_FAIL; + } + + ((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE; + + return USBD_OK; +} + +/** + * @brief USBD_HID_Init + * DeInitialize the HID layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_HID_DeInit(USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + /* Close HID EPs */ + USBD_LL_CloseEP(pdev, HID_EPIN_ADDR); + pdev->ep_in[HID_EPIN_ADDR & 0xFU].is_used = 0U; + + /* FRee allocated memory */ + if (pdev->pClassData != NULL) + { + USBD_free(pdev->pClassData); + pdev->pClassData = NULL; + } + + return USBD_OK; +} + +/** + * @brief USBD_HID_Setup + * Handle the HID specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_HID_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *) pdev->pClassData; + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint16_t status_info = 0U; + USBD_StatusTypeDef ret = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS : + switch (req->bRequest) + { + case HID_REQ_SET_PROTOCOL: + hhid->Protocol = (uint8_t)(req->wValue); + break; + + case HID_REQ_GET_PROTOCOL: + USBD_CtlSendData(pdev, (uint8_t *)(void *)&hhid->Protocol, 1U); + break; + + case HID_REQ_SET_IDLE: + hhid->IdleState = (uint8_t)(req->wValue >> 8); + break; + + case HID_REQ_GET_IDLE: + USBD_CtlSendData(pdev, (uint8_t *)(void *)&hhid->IdleState, 1U); + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + break; + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_STATUS: + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + USBD_CtlSendData(pdev, (uint8_t *)(void *)&status_info, 2U); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_GET_DESCRIPTOR: + if (req->wValue >> 8 == HID_REPORT_DESC) + { + len = MIN(HID_MOUSE_REPORT_DESC_SIZE, req->wLength); + pbuf = HID_MOUSE_ReportDesc; + } + else if (req->wValue >> 8 == HID_DESCRIPTOR_TYPE) + { + pbuf = USBD_HID_Desc; + len = MIN(USB_HID_DESC_SIZ, req->wLength); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + USBD_CtlSendData(pdev, pbuf, len); + break; + + case USB_REQ_GET_INTERFACE : + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + USBD_CtlSendData(pdev, (uint8_t *)(void *)&hhid->AltSetting, 1U); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_SET_INTERFACE : + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + hhid->AltSetting = (uint8_t)(req->wValue); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + + return ret; +} + +/** + * @brief USBD_HID_SendReport + * Send HID Report + * @param pdev: device instance + * @param buff: pointer to report + * @retval status + */ +uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len) +{ + USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *)pdev->pClassData; + + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + if (hhid->state == HID_IDLE) + { + hhid->state = HID_BUSY; + USBD_LL_Transmit(pdev, + HID_EPIN_ADDR, + report, + len); + } + } + return USBD_OK; +} + +/** + * @brief USBD_HID_GetPollingInterval + * return polling interval from endpoint descriptor + * @param pdev: device instance + * @retval polling interval + */ +uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev) +{ + uint32_t polling_interval = 0U; + + /* HIGH-speed endpoints */ + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + /* Sets the data transfer polling interval for high speed transfers. + Values between 1..16 are allowed. Values correspond to interval + of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */ + polling_interval = (((1U << (HID_HS_BINTERVAL - 1U))) / 8U); + } + else /* LOW and FULL-speed endpoints */ + { + /* Sets the data transfer polling interval for low and full + speed transfers */ + polling_interval = HID_FS_BINTERVAL; + } + + return ((uint32_t)(polling_interval)); +} + +/** + * @brief USBD_HID_GetCfgFSDesc + * return FS configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_HID_CfgFSDesc); + return USBD_HID_CfgFSDesc; +} + +/** + * @brief USBD_HID_GetCfgHSDesc + * return HS configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_HID_CfgHSDesc); + return USBD_HID_CfgHSDesc; +} + +/** + * @brief USBD_HID_GetOtherSpeedCfgDesc + * return other speed configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_HID_OtherSpeedCfgDesc); + return USBD_HID_OtherSpeedCfgDesc; +} + +/** + * @brief USBD_HID_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_HID_DataIn(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + + /* Ensure that the FIFO is empty before a new transfer, this condition could + be caused by a new transfer before the end of the previous transfer */ + ((USBD_HID_HandleTypeDef *)pdev->pClassData)->state = HID_IDLE; + return USBD_OK; +} + + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +static uint8_t *USBD_HID_GetDeviceQualifierDesc(uint16_t *length) +{ + *length = sizeof(USBD_HID_DeviceQualifierDesc); + return USBD_HID_DeviceQualifierDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h new file mode 100644 index 0000000..2392815 --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h @@ -0,0 +1,161 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @brief Header file for usbd_core.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" +#include "usbd_def.h" +#include "usbd_ioreq.h" +#include "usbd_ctlreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_CORE + * @brief This file is the Header file for usbd_core.c file + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ +#ifndef USBD_DEBUG_LEVEL +#define USBD_DEBUG_LEVEL 0U +#endif /* USBD_DEBUG_LEVEL */ +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ +#define USBD_SOF USBD_LL_SOF +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_FunctionsPrototype + * @{ + */ +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); +USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); + +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); + +USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); + +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); + +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); + +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); + +/* USBD Low Level Driver */ +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, + uint8_t ep_addr, + uint8_t ep_type, + uint16_t ep_mps); + +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t size); + +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t size); + +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +void USBD_LL_Delay(uint32_t Delay); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CORE_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h new file mode 100644 index 0000000..047fe2e --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h @@ -0,0 +1,105 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @brief Header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_REQUEST_H +#define __USB_REQUEST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief header file for the usbd_req.c file + * @{ + */ + +/** @defgroup USBD_REQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Exported_Types + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_REQ_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + + +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + +void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_REQUEST_H */ + +/** + * @} + */ + +/** +* @} +*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h new file mode 100644 index 0000000..a805e8b --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -0,0 +1,348 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @brief General defines for the usb device library + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_DEF_H +#define __USBD_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USBD_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DEF + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DEF_Exported_Defines + * @{ + */ + +#ifndef NULL +#define NULL 0U +#endif /* NULL */ + +#ifndef USBD_MAX_NUM_INTERFACES +#define USBD_MAX_NUM_INTERFACES 1U +#endif /* USBD_MAX_NUM_CONFIGURATION */ + +#ifndef USBD_MAX_NUM_CONFIGURATION +#define USBD_MAX_NUM_CONFIGURATION 1U +#endif /* USBD_MAX_NUM_CONFIGURATION */ + +#ifndef USBD_LPM_ENABLED +#define USBD_LPM_ENABLED 0U +#endif /* USBD_LPM_ENABLED */ + +#ifndef USBD_SELF_POWERED +#define USBD_SELF_POWERED 1U +#endif /*USBD_SELF_POWERED */ + +#ifndef USBD_SUPPORT_USER_STRING_DESC +#define USBD_SUPPORT_USER_STRING_DESC 0U +#endif /* USBD_SUPPORT_USER_STRING_DESC */ + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU +#define USB_LEN_DEV_DESC 0x12U +#define USB_LEN_CFG_DESC 0x09U +#define USB_LEN_IF_DESC 0x09U +#define USB_LEN_EP_DESC 0x07U +#define USB_LEN_OTG_DESC 0x03U +#define USB_LEN_LANGID_STR_DESC 0x04U +#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U + +#define USBD_IDX_LANGID_STR 0x00U +#define USBD_IDX_MFC_STR 0x01U +#define USBD_IDX_PRODUCT_STR 0x02U +#define USBD_IDX_SERIAL_STR 0x03U +#define USBD_IDX_CONFIG_STR 0x04U +#define USBD_IDX_INTERFACE_STR 0x05U + +#define USB_REQ_TYPE_STANDARD 0x00U +#define USB_REQ_TYPE_CLASS 0x20U +#define USB_REQ_TYPE_VENDOR 0x40U +#define USB_REQ_TYPE_MASK 0x60U + +#define USB_REQ_RECIPIENT_DEVICE 0x00U +#define USB_REQ_RECIPIENT_INTERFACE 0x01U +#define USB_REQ_RECIPIENT_ENDPOINT 0x02U +#define USB_REQ_RECIPIENT_MASK 0x03U + +#define USB_REQ_GET_STATUS 0x00U +#define USB_REQ_CLEAR_FEATURE 0x01U +#define USB_REQ_SET_FEATURE 0x03U +#define USB_REQ_SET_ADDRESS 0x05U +#define USB_REQ_GET_DESCRIPTOR 0x06U +#define USB_REQ_SET_DESCRIPTOR 0x07U +#define USB_REQ_GET_CONFIGURATION 0x08U +#define USB_REQ_SET_CONFIGURATION 0x09U +#define USB_REQ_GET_INTERFACE 0x0AU +#define USB_REQ_SET_INTERFACE 0x0BU +#define USB_REQ_SYNCH_FRAME 0x0CU + +#define USB_DESC_TYPE_DEVICE 0x01U +#define USB_DESC_TYPE_CONFIGURATION 0x02U +#define USB_DESC_TYPE_STRING 0x03U +#define USB_DESC_TYPE_INTERFACE 0x04U +#define USB_DESC_TYPE_ENDPOINT 0x05U +#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U +#define USB_DESC_TYPE_BOS 0x0FU + +#define USB_CONFIG_REMOTE_WAKEUP 0x02U +#define USB_CONFIG_SELF_POWERED 0x01U + +#define USB_FEATURE_EP_HALT 0x00U +#define USB_FEATURE_REMOTE_WAKEUP 0x01U +#define USB_FEATURE_TEST_MODE 0x02U + +#define USB_DEVICE_CAPABITY_TYPE 0x10U + +#define USB_HS_MAX_PACKET_SIZE 512U +#define USB_FS_MAX_PACKET_SIZE 64U +#define USB_MAX_EP0_SIZE 64U + +/* Device Status */ +#define USBD_STATE_DEFAULT 0x01U +#define USBD_STATE_ADDRESSED 0x02U +#define USBD_STATE_CONFIGURED 0x03U +#define USBD_STATE_SUSPENDED 0x04U + + +/* EP0 State */ +#define USBD_EP0_IDLE 0x00U +#define USBD_EP0_SETUP 0x01U +#define USBD_EP0_DATA_IN 0x02U +#define USBD_EP0_DATA_OUT 0x03U +#define USBD_EP0_STATUS_IN 0x04U +#define USBD_EP0_STATUS_OUT 0x05U +#define USBD_EP0_STALL 0x06U + +#define USBD_EP_TYPE_CTRL 0x00U +#define USBD_EP_TYPE_ISOC 0x01U +#define USBD_EP_TYPE_BULK 0x02U +#define USBD_EP_TYPE_INTR 0x03U + + +/** + * @} + */ + + +/** @defgroup USBD_DEF_Exported_TypesDefinitions + * @{ + */ + +typedef struct usb_setup_req +{ + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USBD_SetupReqTypedef; + +struct _USBD_HandleTypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); + /* Class Specific Endpoints*/ + uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + + uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); + uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); + uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); + uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); +#endif + +} USBD_ClassTypeDef; + +/* Following USB Device Speed */ +typedef enum +{ + USBD_SPEED_HIGH = 0U, + USBD_SPEED_FULL = 1U, + USBD_SPEED_LOW = 2U, +} USBD_SpeedTypeDef; + +/* Following USB Device status */ +typedef enum +{ + USBD_OK = 0U, + USBD_BUSY, + USBD_FAIL, +} USBD_StatusTypeDef; + +/* USB Device descriptors structure */ +typedef struct +{ + uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); +#if (USBD_LPM_ENABLED == 1U) + uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); +#endif +} USBD_DescriptorsTypeDef; + +/* USB Device handle structure */ +typedef struct +{ + uint32_t status; + uint32_t is_used; + uint32_t total_length; + uint32_t rem_length; + uint32_t maxpacket; +} USBD_EndpointTypeDef; + +/* USB Device handle structure */ +typedef struct _USBD_HandleTypeDef +{ + uint8_t id; + uint32_t dev_config; + uint32_t dev_default_config; + uint32_t dev_config_status; + USBD_SpeedTypeDef dev_speed; + USBD_EndpointTypeDef ep_in[16]; + USBD_EndpointTypeDef ep_out[16]; + uint32_t ep0_state; + uint32_t ep0_data_len; + uint8_t dev_state; + uint8_t dev_old_state; + uint8_t dev_address; + uint8_t dev_connection_status; + uint8_t dev_test_mode; + uint32_t dev_remote_wakeup; + + USBD_SetupReqTypedef request; + USBD_DescriptorsTypeDef *pDesc; + USBD_ClassTypeDef *pClass; + void *pClassData; + void *pUserData; + void *pData; +} USBD_HandleTypeDef; + +/** + * @} + */ + + + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) + +#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) +#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) + + +#if defined ( __GNUC__ ) +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif /* __packed */ +#endif /* __GNUC__ */ + + +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ + +#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4U))) +#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 */ +#define __ALIGN_BEGIN __align(4U) +#elif defined (__ICCARM__) /* IAR Compiler */ +#define __ALIGN_BEGIN +#endif /* __CC_ARM */ +#endif /* __ALIGN_BEGIN */ +#endif /* __GNUC__ */ + + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_DEF_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h new file mode 100644 index 0000000..629369e --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h @@ -0,0 +1,119 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @brief Header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_IOREQ_H +#define __USBD_IOREQ_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_IOREQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_IOREQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Exported_Types + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_IOREQ_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); + +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); + +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_IOREQ_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c new file mode 100644 index 0000000..ca87977 --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -0,0 +1,611 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + +/** @addtogroup STM32_USBD_DEVICE_LIBRARY +* @{ +*/ + + +/** @defgroup USBD_CORE +* @brief usbd core module +* @{ +*/ + +/** @defgroup USBD_CORE_Private_TypesDefinitions +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Macros +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_FunctionPrototypes +* @{ +*/ + +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Variables +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USBD_Init +* Initializes the device stack and load the class driver +* @param pdev: device instance +* @param pdesc: Descriptor structure address +* @param id: Low level core index +* @retval None +*/ +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, + USBD_DescriptorsTypeDef *pdesc, uint8_t id) +{ + /* Check whether the USB Host handle is valid */ + if (pdev == NULL) + { +#if (USBD_DEBUG_LEVEL > 1U) + USBD_ErrLog("Invalid Device handle"); +#endif + return USBD_FAIL; + } + + /* Unlink previous class*/ + if (pdev->pClass != NULL) + { + pdev->pClass = NULL; + } + + /* Assign USBD Descriptors */ + if (pdesc != NULL) + { + pdev->pDesc = pdesc; + } + + /* Set Device initial State */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->id = id; + /* Initialize low level driver */ + USBD_LL_Init(pdev); + + return USBD_OK; +} + +/** +* @brief USBD_DeInit +* Re-Initialize th device library +* @param pdev: device instance +* @retval status: status +*/ +USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) +{ + /* Set Default State */ + pdev->dev_state = USBD_STATE_DEFAULT; + + /* Free Class Resources */ + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + /* Stop the low level driver */ + USBD_LL_Stop(pdev); + + /* Initialize low level driver */ + USBD_LL_DeInit(pdev); + + return USBD_OK; +} + +/** + * @brief USBD_RegisterClass + * Link class driver to Device Core. + * @param pDevice : Device Handle + * @param pclass: Class handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) +{ + USBD_StatusTypeDef status = USBD_OK; + if (pclass != NULL) + { + /* link the class to the USB Device handle */ + pdev->pClass = pclass; + status = USBD_OK; + } + else + { +#if (USBD_DEBUG_LEVEL > 1U) + USBD_ErrLog("Invalid Class handle"); +#endif + status = USBD_FAIL; + } + + return status; +} + +/** + * @brief USBD_Start + * Start the USB Device Core. + * @param pdev: Device Handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) +{ + /* Start the low level driver */ + USBD_LL_Start(pdev); + + return USBD_OK; +} + +/** + * @brief USBD_Stop + * Stop the USB Device Core. + * @param pdev: Device Handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) +{ + /* Free Class Resources */ + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + /* Stop the low level driver */ + USBD_LL_Stop(pdev); + + return USBD_OK; +} + +/** +* @brief USBD_RunTestMode +* Launch test mode process +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) +{ + /* Prevent unused argument compilation warning */ + UNUSED(pdev); + + return USBD_OK; +} + +/** +* @brief USBD_SetClassConfig +* Configure device and start the interface +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status +*/ + +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + USBD_StatusTypeDef ret = USBD_FAIL; + + if (pdev->pClass != NULL) + { + /* Set configuration and Start the Class*/ + if (pdev->pClass->Init(pdev, cfgidx) == 0U) + { + ret = USBD_OK; + } + } + + return ret; +} + +/** +* @brief USBD_ClrClassConfig +* Clear current configuration +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status: USBD_StatusTypeDef +*/ +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + /* Clear configuration and De-initialize the Class process*/ + pdev->pClass->DeInit(pdev, cfgidx); + + return USBD_OK; +} + + +/** +* @brief USBD_SetupStage +* Handle the setup stage +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) +{ + USBD_ParseSetupRequest(&pdev->request, psetup); + + pdev->ep0_state = USBD_EP0_SETUP; + + pdev->ep0_data_len = pdev->request.wLength; + + switch (pdev->request.bmRequest & 0x1FU) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq(pdev, &pdev->request); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(pdev, &pdev->request); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(pdev, &pdev->request); + break; + + default: + USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); + break; + } + + return USBD_OK; +} + +/** +* @brief USBD_DataOutStage +* Handle data OUT stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) +{ + USBD_EndpointTypeDef *pep; + + if (epnum == 0U) + { + pep = &pdev->ep_out[0]; + + if (pdev->ep0_state == USBD_EP0_DATA_OUT) + { + if (pep->rem_length > pep->maxpacket) + { + pep->rem_length -= pep->maxpacket; + + USBD_CtlContinueRx(pdev, pdata, + (uint16_t)MIN(pep->rem_length, pep->maxpacket)); + } + else + { + if ((pdev->pClass->EP0_RxReady != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) + { + pdev->pClass->EP0_RxReady(pdev); + } + USBD_CtlSendStatus(pdev); + } + } + else + { + if (pdev->ep0_state == USBD_EP0_STATUS_OUT) + { + /* + * STATUS PHASE completed, update ep0_state to idle + */ + pdev->ep0_state = USBD_EP0_IDLE; + USBD_LL_StallEP(pdev, 0U); + } + } + } + else if ((pdev->pClass->DataOut != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) + { + pdev->pClass->DataOut(pdev, epnum); + } + else + { + /* should never be in this condition */ + return USBD_FAIL; + } + + return USBD_OK; +} + +/** +* @brief USBD_DataInStage +* Handle data in stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) +{ + USBD_EndpointTypeDef *pep; + + if (epnum == 0U) + { + pep = &pdev->ep_in[0]; + + if (pdev->ep0_state == USBD_EP0_DATA_IN) + { + if (pep->rem_length > pep->maxpacket) + { + pep->rem_length -= pep->maxpacket; + + USBD_CtlContinueSendData(pdev, pdata, (uint16_t)pep->rem_length); + + /* Prepare endpoint for premature end of transfer */ + USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); + } + else + { + /* last packet is MPS multiple, so send ZLP packet */ + if ((pep->total_length % pep->maxpacket == 0U) && + (pep->total_length >= pep->maxpacket) && + (pep->total_length < pdev->ep0_data_len)) + { + USBD_CtlContinueSendData(pdev, NULL, 0U); + pdev->ep0_data_len = 0U; + + /* Prepare endpoint for premature end of transfer */ + USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); + } + else + { + if ((pdev->pClass->EP0_TxSent != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) + { + pdev->pClass->EP0_TxSent(pdev); + } + USBD_LL_StallEP(pdev, 0x80U); + USBD_CtlReceiveStatus(pdev); + } + } + } + else + { + if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || + (pdev->ep0_state == USBD_EP0_IDLE)) + { + USBD_LL_StallEP(pdev, 0x80U); + } + } + + if (pdev->dev_test_mode == 1U) + { + USBD_RunTestMode(pdev); + pdev->dev_test_mode = 0U; + } + } + else if ((pdev->pClass->DataIn != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) + { + pdev->pClass->DataIn(pdev, epnum); + } + else + { + /* should never be in this condition */ + return USBD_FAIL; + } + + return USBD_OK; +} + +/** +* @brief USBD_LL_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ + +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) +{ + /* Open EP0 OUT */ + USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + pdev->ep_out[0x00U & 0xFU].is_used = 1U; + + pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; + + /* Open EP0 IN */ + USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + pdev->ep_in[0x80U & 0xFU].is_used = 1U; + + pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; + + /* Upon Reset call user call back */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config = 0U; + pdev->dev_remote_wakeup = 0U; + + if (pdev->pClassData) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } + + return USBD_OK; +} + +/** +* @brief USBD_LL_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, + USBD_SpeedTypeDef speed) +{ + pdev->dev_speed = speed; + + return USBD_OK; +} + +/** +* @brief USBD_Suspend +* Handle Suspend event +* @param pdev: device instance +* @retval status +*/ + +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) +{ + pdev->dev_old_state = pdev->dev_state; + pdev->dev_state = USBD_STATE_SUSPENDED; + + return USBD_OK; +} + +/** +* @brief USBD_Resume +* Handle Resume event +* @param pdev: device instance +* @retval status +*/ + +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) +{ + if (pdev->dev_state == USBD_STATE_SUSPENDED) + { + pdev->dev_state = pdev->dev_old_state; + } + + return USBD_OK; +} + +/** +* @brief USBD_SOF +* Handle SOF event +* @param pdev: device instance +* @retval status +*/ + +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) +{ + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + if (pdev->pClass->SOF != NULL) + { + pdev->pClass->SOF(pdev); + } + } + + return USBD_OK; +} + +/** +* @brief USBD_IsoINIncomplete +* Handle iso in incomplete event +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + /* Prevent unused arguments compilation warning */ + UNUSED(pdev); + UNUSED(epnum); + + return USBD_OK; +} + +/** +* @brief USBD_IsoOUTIncomplete +* Handle iso out incomplete event +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + /* Prevent unused arguments compilation warning */ + UNUSED(pdev); + UNUSED(epnum); + + return USBD_OK; +} + +/** +* @brief USBD_DevConnected +* Handle device connection event +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) +{ + /* Prevent unused argument compilation warning */ + UNUSED(pdev); + + return USBD_OK; +} + +/** +* @brief USBD_DevDisconnected +* Handle device disconnection event +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) +{ + /* Free Class Resources */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + return USBD_OK; +} +/** +* @} +*/ + + +/** +* @} +*/ + + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c new file mode 100644 index 0000000..4561c8d --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c @@ -0,0 +1,918 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ctlreq.h" +#include "usbd_ioreq.h" + + +/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static void USBD_SetConfig(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t USBD_GetLen(uint8_t *buf); + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + + +/** +* @brief USBD_StdDevReq +* Handle standard usb device requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + USBD_StatusTypeDef ret = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS: + case USB_REQ_TYPE_VENDOR: + pdev->pClass->Setup(pdev, req); + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + USBD_GetDescriptor(pdev, req); + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig(pdev, req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig(pdev, req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus(pdev, req); + break; + + case USB_REQ_SET_FEATURE: + USBD_SetFeature(pdev, req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature(pdev, req); + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + + return ret; +} + +/** +* @brief USBD_StdItfReq +* Handle standard usb interface requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + USBD_StatusTypeDef ret = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS: + case USB_REQ_TYPE_VENDOR: + case USB_REQ_TYPE_STANDARD: + switch (pdev->dev_state) + { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) + { + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); + + if ((req->wLength == 0U) && (ret == USBD_OK)) + { + USBD_CtlSendStatus(pdev); + } + } + else + { + USBD_CtlError(pdev, req); + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + + return USBD_OK; +} + +/** +* @brief USBD_StdEPReq +* Handle standard usb endpoint requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + USBD_EndpointTypeDef *pep; + uint8_t ep_addr; + USBD_StatusTypeDef ret = USBD_OK; + ep_addr = LOBYTE(req->wIndex); + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_CLASS: + case USB_REQ_TYPE_VENDOR: + pdev->pClass->Setup(pdev, req); + break; + + case USB_REQ_TYPE_STANDARD: + /* Check if it is a class request */ + if ((req->bmRequest & 0x60U) == 0x20U) + { + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); + + return ret; + } + + switch (req->bRequest) + { + case USB_REQ_SET_FEATURE: + switch (pdev->dev_state) + { + case USBD_STATE_ADDRESSED: + if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) + { + USBD_LL_StallEP(pdev, ep_addr); + USBD_LL_StallEP(pdev, 0x80U); + } + else + { + USBD_CtlError(pdev, req); + } + break; + + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00U) && + (ep_addr != 0x80U) && (req->wLength == 0x00U)) + { + USBD_LL_StallEP(pdev, ep_addr); + } + } + USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE: + + switch (pdev->dev_state) + { + case USBD_STATE_ADDRESSED: + if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) + { + USBD_LL_StallEP(pdev, ep_addr); + USBD_LL_StallEP(pdev, 0x80U); + } + else + { + USBD_CtlError(pdev, req); + } + break; + + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr & 0x7FU) != 0x00U) + { + USBD_LL_ClearStallEP(pdev, ep_addr); + } + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev_state) + { + case USBD_STATE_ADDRESSED: + if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) + { + USBD_CtlError(pdev, req); + break; + } + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; + + pep->status = 0x0000U; + + USBD_CtlSendData(pdev, (uint8_t *)(void *)&pep->status, 2U); + break; + + case USBD_STATE_CONFIGURED: + if ((ep_addr & 0x80U) == 0x80U) + { + if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) + { + USBD_CtlError(pdev, req); + break; + } + } + else + { + if (pdev->ep_out[ep_addr & 0xFU].is_used == 0U) + { + USBD_CtlError(pdev, req); + break; + } + } + + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; + + if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) + { + pep->status = 0x0000U; + } + else if (USBD_LL_IsStallEP(pdev, ep_addr)) + { + pep->status = 0x0001U; + } + else + { + pep->status = 0x0000U; + } + + USBD_CtlSendData(pdev, (uint8_t *)(void *)&pep->status, 2U); + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + + return ret; +} + + +/** +* @brief USBD_GetDescriptor +* Handle Get Descriptor requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint8_t err = 0U; + + switch (req->wValue >> 8) + { +#if (USBD_LPM_ENABLED == 1U) + case USB_DESC_TYPE_BOS: + if (pdev->pDesc->GetBOSDescriptor != NULL) + { + pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; +#endif + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len); + break; + + case USB_DESC_TYPE_CONFIGURATION: + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + pbuf = pdev->pClass->GetHSConfigDescriptor(&len); + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + } + else + { + pbuf = pdev->pClass->GetFSConfigDescriptor(&len); + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + } + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + if (pdev->pDesc->GetLangIDStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_MFC_STR: + if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_PRODUCT_STR: + if (pdev->pDesc->GetProductStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_SERIAL_STR: + if (pdev->pDesc->GetSerialStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_CONFIG_STR: + if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_INTERFACE_STR: + if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + default: +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + if (pdev->pClass->GetUsrStrDescriptor != NULL) + { + pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; +#else + USBD_CtlError(pdev, req); + err++; +#endif + } + break; + + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + } + else + { + USBD_CtlError(pdev, req); + err++; + } + break; + + default: + USBD_CtlError(pdev, req); + err++; + break; + } + + if (err != 0U) + { + return; + } + else + { + if ((len != 0U) && (req->wLength != 0U)) + { + len = MIN(len, req->wLength); + (void)USBD_CtlSendData(pdev, pbuf, len); + } + + if (req->wLength == 0U) + { + (void)USBD_CtlSendStatus(pdev); + } + } +} + +/** +* @brief USBD_SetAddress +* Set device address +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0U) && (req->wLength == 0U) && (req->wValue < 128U)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7FU; + + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + USBD_CtlError(pdev, req); + } + else + { + pdev->dev_address = dev_addr; + USBD_LL_SetUSBAddress(pdev, dev_addr); + USBD_CtlSendStatus(pdev); + + if (dev_addr != 0U) + { + pdev->dev_state = USBD_STATE_ADDRESSED; + } + else + { + pdev->dev_state = USBD_STATE_DEFAULT; + } + } + } + else + { + USBD_CtlError(pdev, req); + } +} + +/** +* @brief USBD_SetConfig +* Handle Set device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_MAX_NUM_CONFIGURATION) + { + USBD_CtlError(pdev, req); + } + else + { + switch (pdev->dev_state) + { + case USBD_STATE_ADDRESSED: + if (cfgidx) + { + pdev->dev_config = cfgidx; + pdev->dev_state = USBD_STATE_CONFIGURED; + if (USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) + { + USBD_CtlError(pdev, req); + return; + } + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + case USBD_STATE_CONFIGURED: + if (cfgidx == 0U) + { + pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_config = cfgidx; + USBD_ClrClassConfig(pdev, cfgidx); + USBD_CtlSendStatus(pdev); + } + else if (cfgidx != pdev->dev_config) + { + /* Clear old configuration */ + USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + + /* set new configuration */ + pdev->dev_config = cfgidx; + if (USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) + { + USBD_CtlError(pdev, req); + return; + } + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + USBD_ClrClassConfig(pdev, cfgidx); + break; + } + } +} + +/** +* @brief USBD_GetConfig +* Handle Get device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + if (req->wLength != 1U) + { + USBD_CtlError(pdev, req); + } + else + { + switch (pdev->dev_state) + { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + pdev->dev_default_config = 0U; + USBD_CtlSendData(pdev, (uint8_t *)(void *)&pdev->dev_default_config, 1U); + break; + + case USBD_STATE_CONFIGURED: + USBD_CtlSendData(pdev, (uint8_t *)(void *)&pdev->dev_config, 1U); + break; + + default: + USBD_CtlError(pdev, req); + break; + } + } +} + +/** +* @brief USBD_GetStatus +* Handle Get Status request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + switch (pdev->dev_state) + { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wLength != 0x2U) + { + USBD_CtlError(pdev, req); + break; + } + +#if (USBD_SELF_POWERED == 1U) + pdev->dev_config_status = USB_CONFIG_SELF_POWERED; +#else + pdev->dev_config_status = 0U; +#endif + + if (pdev->dev_remote_wakeup) + { + pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; + } + + USBD_CtlSendData(pdev, (uint8_t *)(void *)&pdev->dev_config_status, 2U); + break; + + default: + USBD_CtlError(pdev, req); + break; + } +} + + +/** +* @brief USBD_SetFeature +* Handle Set device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev_remote_wakeup = 1U; + USBD_CtlSendStatus(pdev); + } +} + + +/** +* @brief USBD_ClrFeature +* Handle clear device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + switch (pdev->dev_state) + { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev_remote_wakeup = 0U; + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } +} + +/** +* @brief USBD_ParseSetupRequest +* Copy buffer into setup structure +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) +{ + req->bmRequest = *(uint8_t *)(pdata); + req->bRequest = *(uint8_t *)(pdata + 1U); + req->wValue = SWAPBYTE(pdata + 2U); + req->wIndex = SWAPBYTE(pdata + 4U); + req->wLength = SWAPBYTE(pdata + 6U); + +} + +/** +* @brief USBD_CtlError +* Handle USB low level Error +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_CtlError(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + USBD_LL_StallEP(pdev, 0x80U); + USBD_LL_StallEP(pdev, 0U); +} + + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0U; + + if (desc != NULL) + { + *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; + unicode[idx++] = *(uint8_t *)(void *)len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != '\0') + { + unicode[idx++] = *desc++; + unicode[idx++] = 0U; + } + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0U; + + while (*buf != '\0') + { + len++; + buf++; + } + + return len; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c new file mode 100644 index 0000000..7e969de --- /dev/null +++ b/arcadestick_software/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c @@ -0,0 +1,216 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_IOREQ + * @brief control I/O requests module + * @{ + */ + +/** @defgroup USBD_IOREQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Functions + * @{ + */ + +/** +* @brief USBD_CtlSendData +* send data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint16_t len) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_DATA_IN; + pdev->ep_in[0].total_length = len; + pdev->ep_in[0].rem_length = len; + + /* Start the transfer */ + USBD_LL_Transmit(pdev, 0x00U, pbuf, len); + + return USBD_OK; +} + +/** +* @brief USBD_CtlContinueSendData +* continue sending data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint16_t len) +{ + /* Start the next transfer */ + USBD_LL_Transmit(pdev, 0x00U, pbuf, len); + + return USBD_OK; +} + +/** +* @brief USBD_CtlPrepareRx +* receive data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint16_t len) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_DATA_OUT; + pdev->ep_out[0].total_length = len; + pdev->ep_out[0].rem_length = len; + + /* Start the transfer */ + USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + + return USBD_OK; +} + +/** +* @brief USBD_CtlContinueRx +* continue receive data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint16_t len) +{ + USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + + return USBD_OK; +} + +/** +* @brief USBD_CtlSendStatus +* send zero lzngth packet on the ctl pipe +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_STATUS_IN; + + /* Start the transfer */ + USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); + + return USBD_OK; +} + +/** +* @brief USBD_CtlReceiveStatus +* receive zero lzngth packet on the ctl pipe +* @param pdev: device instance +* @retval status +*/ +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_STATUS_OUT; + + /* Start the transfer */ + USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); + + return USBD_OK; +} + +/** +* @brief USBD_GetRxCount +* returns the received data length +* @param pdev: device instance +* @param ep_addr: endpoint address +* @retval Rx Data blength +*/ +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + return USBD_LL_GetRxDataSize(pdev, ep_addr); +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/arcadestick_software/STM32F103xx_FLASH.ld b/arcadestick_software/STM32F103xx_FLASH.ld new file mode 100644 index 0000000..7916f2c --- /dev/null +++ b/arcadestick_software/STM32F103xx_FLASH.ld @@ -0,0 +1,250 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : STM32CubeMX +** +** Abstract : Linker script for STM32F103RBTx series +** 128Kbytes FLASH and 20Kbytes 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 = 20K +FLASH (rx) : ORIGIN = FIRMWARE_FLASH_ORIGIN, LENGTH = FIRMWARE_FLASH_LENGTH +} + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ +_sstack = _estack - _Min_Stack_Size; +/* 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 + + /* 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/arcadestick_software/USB_DEVICE/App/usb_device.c b/arcadestick_software/USB_DEVICE/App/usb_device.c new file mode 100644 index 0000000..57f2495 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usb_device.c @@ -0,0 +1,95 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usb_device.c + * @version : v2.0_Cube + * @brief : This file implements the USB Device + ****************************************************************************** + * @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 "usb_device.h" +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_hid.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* USB Device Core handle declaration. */ +USBD_HandleTypeDef hUsbDeviceFS; + +/* + * -- Insert your variables declaration here -- + */ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* + * -- Insert your external function declaration here -- + */ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Init USB device Library, add supported class and start the library + * @retval None + */ +void MX_USB_DEVICE_Init(void) +{ + /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ + + /* USER CODE END USB_DEVICE_Init_PreTreatment */ + + /* Init Device Library, add supported class and start the library. */ + if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) + { + Error_Handler(); + } + if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID) != USBD_OK) + { + Error_Handler(); + } + if (USBD_Start(&hUsbDeviceFS) != USBD_OK) + { + Error_Handler(); + } + + /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */ + + /* USER CODE END USB_DEVICE_Init_PostTreatment */ +} + +/** + * @} + */ + +/** + * @} + */ + diff --git a/arcadestick_software/USB_DEVICE/App/usb_device.h b/arcadestick_software/USB_DEVICE/App/usb_device.h new file mode 100644 index 0000000..fb8ff9e --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usb_device.h @@ -0,0 +1,102 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usb_device.h + * @version : v2.0_Cube + * @brief : Header for usb_device.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 __USB_DEVICE__H__ +#define __USB_DEVICE__H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f1xx.h" +#include "stm32f1xx_hal.h" +#include "usbd_def.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup USBD_OTG_DRIVER + * @{ + */ + +/** @defgroup USBD_DEVICE USBD_DEVICE + * @brief Device file for Usb otg low level driver. + * @{ + */ + +/** @defgroup USBD_DEVICE_Exported_Variables USBD_DEVICE_Exported_Variables + * @brief Public variables. + * @{ + */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* + * -- Insert your variables declaration here -- + */ +/* USER CODE BEGIN VARIABLES */ + +/* USER CODE END VARIABLES */ +/** + * @} + */ + +/** @defgroup USBD_DEVICE_Exported_FunctionsPrototype USBD_DEVICE_Exported_FunctionsPrototype + * @brief Declaration of public functions for Usb device. + * @{ + */ + +/** USB Device initialization function. */ +void MX_USB_DEVICE_Init(void); + +/* + * -- Insert functions declaration here -- + */ +/* USER CODE BEGIN FD */ + +/* USER CODE END FD */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_DEVICE__H__ */ diff --git a/arcadestick_software/USB_DEVICE/App/usb_device_dfu.c b/arcadestick_software/USB_DEVICE/App/usb_device_dfu.c new file mode 100644 index 0000000..e1395a2 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usb_device_dfu.c @@ -0,0 +1,23 @@ +#include "usb_device.h" + +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_dfu_bootloader.h" + +USBD_HandleTypeDef hUsbDeviceFS; + +void MX_USB_DEVICE_Init(void) +{ + if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) + { + Error_Handler(); + } + if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_DFU_BOOTLOADER) != USBD_OK) + { + Error_Handler(); + } + if (USBD_Start(&hUsbDeviceFS) != USBD_OK) + { + Error_Handler(); + } +} diff --git a/arcadestick_software/USB_DEVICE/App/usb_device_dinput.c b/arcadestick_software/USB_DEVICE/App/usb_device_dinput.c new file mode 100644 index 0000000..027bb52 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usb_device_dinput.c @@ -0,0 +1,23 @@ +#include "usb_device.h" + +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_dinput.h" + +USBD_HandleTypeDef hUsbDeviceFS; + +void MX_USB_DEVICE_Init(void) +{ + if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) + { + Error_Handler(); + } + if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_DINPUT) != USBD_OK) + { + Error_Handler(); + } + if (USBD_Start(&hUsbDeviceFS) != USBD_OK) + { + Error_Handler(); + } +} diff --git a/arcadestick_software/USB_DEVICE/App/usb_device_xinput.c b/arcadestick_software/USB_DEVICE/App/usb_device_xinput.c new file mode 100644 index 0000000..a9a1119 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usb_device_xinput.c @@ -0,0 +1,23 @@ +#include "usb_device.h" + +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_xinput.h" + +USBD_HandleTypeDef hUsbDeviceFS; + +void MX_USB_DEVICE_Init(void) +{ + if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) + { + Error_Handler(); + } + if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_XINPUT) != USBD_OK) + { + Error_Handler(); + } + if (USBD_Start(&hUsbDeviceFS) != USBD_OK) + { + Error_Handler(); + } +} diff --git a/arcadestick_software/USB_DEVICE/App/usbd_desc.c b/arcadestick_software/USB_DEVICE/App/usbd_desc.c new file mode 100644 index 0000000..50eed19 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_desc.c @@ -0,0 +1,394 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : App/usbd_desc.c + * @version : v2.0_Cube + * @brief : This file implements the USB device descriptors. + ****************************************************************************** + * @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 "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_conf.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @addtogroup USBD_DESC + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions + * @brief Private types. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_TYPES */ + +/* USER CODE END PRIVATE_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines + * @brief Private defines. + * @{ + */ + +#define USBD_VID 0x1209U +#define USBD_LANGID_STRING 1033 +#define USBD_MANUFACTURER_STRING "ERTOtech" +#define USBD_PID_FS 0xE669U +#define USBD_PRODUCT_STRING_FS "Refleks Lite DInput" +#define USBD_CONFIGURATION_STRING_FS "HID Config" +#define USBD_INTERFACE_STRING_FS "HID Interface" + +/* USER CODE BEGIN PRIVATE_DEFINES */ + +/* USER CODE END PRIVATE_DEFINES */ + +/** + * @} + */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros + * @brief Private macros. + * @{ + */ + +/* USER CODE BEGIN PRIVATE_MACRO */ + +/* USER CODE END PRIVATE_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes + * @brief Private functions declaration. + * @{ + */ + +static void Get_SerialNum(void); +static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes + * @brief Private functions declaration for FS. + * @{ + */ + +uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables + * @brief Private variables. + * @{ + */ + +USBD_DescriptorsTypeDef FS_Desc = +{ + USBD_FS_DeviceDescriptor +, USBD_FS_LangIDStrDescriptor +, USBD_FS_ManufacturerStrDescriptor +, USBD_FS_ProductStrDescriptor +, USBD_FS_SerialStrDescriptor +, USBD_FS_ConfigStrDescriptor +, USBD_FS_InterfaceStrDescriptor +}; + +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ +/** USB standard device descriptor. */ +__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = +{ + 0x12, /*bLength */ + USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ + 0x00, /*bcdUSB */ + 0x02, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID_FS), /*idProduct*/ + HIBYTE(USBD_PID_FS), /*idProduct*/ + 0x00, /*bcdDevice rel. 2.00*/ + 0x02, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ +}; + +/* USB_DeviceDescriptor */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables + * @brief Private variables. + * @{ + */ + +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ + +/** USB lang identifier descriptor. */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = +{ + USB_LEN_LANGID_STR_DESC, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING) +}; + +#if defined ( __ICCARM__ ) /* IAR Compiler */ + #pragma data_alignment=4 +#endif /* defined ( __ICCARM__ ) */ +/* Internal string descriptor. */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 +#endif +__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = { + USB_SIZ_STRING_SERIAL, + USB_DESC_TYPE_STRING, +}; + +/** + * @} + */ + +/** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions + * @brief Private functions. + * @{ + */ + +/** + * @brief Return the device descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_FS_DeviceDesc); + return USBD_FS_DeviceDesc; +} + +/** + * @brief Return the LangID string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + +/** + * @brief Return the product string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Return the manufacturer string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** + * @brief Return the serial number string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = USB_SIZ_STRING_SERIAL; + + /* Update the serial number string descriptor with the data from the unique + * ID */ + Get_SerialNum(); + /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ + + /* USER CODE END USBD_FS_SerialStrDescriptor */ + return (uint8_t *) USBD_StringSerial; +} + +/** + * @brief Return the configuration string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == USBD_SPEED_HIGH) + { + USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Return the interface string descriptor + * @param speed : Current device speed + * @param length : Pointer to data length variable + * @retval Pointer to descriptor buffer + */ +uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + if(speed == 0) + { + USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); + } + else + { + USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); + } + return USBD_StrDesc; +} + +/** + * @brief Create the serial number string descriptor + * @param None + * @retval None + */ +static void Get_SerialNum(void) +{ + uint32_t deviceserial0; + uint32_t deviceserial1; + uint32_t deviceserial2; + + deviceserial0 = *(uint32_t *) DEVICE_ID1; + deviceserial1 = *(uint32_t *) DEVICE_ID2; + deviceserial2 = *(uint32_t *) DEVICE_ID3; + + deviceserial0 += deviceserial2; + + if (deviceserial0 != 0) + { + IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8); + IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4); + } +} + +/** + * @brief Convert Hex 32Bits value into char + * @param value: value to convert + * @param pbuf: pointer to the buffer + * @param len: buffer length + * @retval None + */ +static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len) +{ + uint8_t idx = 0; + + for (idx = 0; idx < len; idx++) + { + if (((value >> 28)) < 0xA) + { + pbuf[2 * idx] = (value >> 28) + '0'; + } + else + { + pbuf[2 * idx] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[2 * idx + 1] = 0; + } +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/arcadestick_software/USB_DEVICE/App/usbd_desc.h b/arcadestick_software/USB_DEVICE/App/usbd_desc.h new file mode 100644 index 0000000..d3cf264 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_desc.h @@ -0,0 +1,143 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_desc.c + * @version : v2.0_Cube + * @brief : Header for usbd_conf.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 __USBD_DESC__C__ +#define __USBD_DESC__C__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_DESC USBD_DESC + * @brief Usb device descriptors module. + * @{ + */ + +/** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants + * @brief Constants. + * @{ + */ +#define DEVICE_ID1 (UID_BASE) +#define DEVICE_ID2 (UID_BASE + 0x4) +#define DEVICE_ID3 (UID_BASE + 0x8) + +#define USB_SIZ_STRING_SERIAL 0x1A + +/* USER CODE BEGIN EXPORTED_CONSTANTS */ + +/* USER CODE END EXPORTED_CONSTANTS */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines + * @brief Defines. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_DEFINES */ + +/* USER CODE END EXPORTED_DEFINES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions + * @brief Types. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_TYPES */ + +/* USER CODE END EXPORTED_TYPES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros + * @brief Aliases. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_MACRO */ + +/* USER CODE END EXPORTED_MACRO */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables + * @brief Public variables. + * @{ + */ + +/** Descriptor for the Usb device. */ +extern USBD_DescriptorsTypeDef FS_Desc; + +/* USER CODE BEGIN EXPORTED_VARIABLES */ + +/* USER CODE END EXPORTED_VARIABLES */ + +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype + * @brief Public functions declaration. + * @{ + */ + +/* USER CODE BEGIN EXPORTED_FUNCTIONS */ + +/* USER CODE END EXPORTED_FUNCTIONS */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_DESC__C__ */ + diff --git a/arcadestick_software/USB_DEVICE/App/usbd_desc_dfu.c b/arcadestick_software/USB_DEVICE/App/usbd_desc_dfu.c new file mode 100644 index 0000000..c5543b0 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_desc_dfu.c @@ -0,0 +1,137 @@ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_conf.h" + +#define DFU_VID 0x1209U +#define DFU_PID 0xE667U +#define DFU_LANGID 0x0409U +#define DFU_MANUFACTURER_STRING "ERTOtech" +#define DFU_PRODUCT_STRING "Refleks Lite DFU" +#define DFU_CONFIG_STRING "DFU Config" +#define DFU_INTERFACE_STRING "DFU Interface" + +static uint8_t *DFU_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *DFU_LangIdDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *DFU_ManufacturerDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *DFU_ProductDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *DFU_SerialDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *DFU_ConfigDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static uint8_t *DFU_InterfaceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); +static void DFU_UpdateSerial(void); +static void DFU_IntToUnicode(uint32_t value, uint8_t *buffer, uint8_t length); + +USBD_DescriptorsTypeDef FS_Desc = +{ + DFU_DeviceDescriptor, + DFU_LangIdDescriptor, + DFU_ManufacturerDescriptor, + DFU_ProductDescriptor, + DFU_SerialDescriptor, + DFU_ConfigDescriptor, + DFU_InterfaceDescriptor, +}; + +__ALIGN_BEGIN static uint8_t dfuDeviceDescriptor[USB_LEN_DEV_DESC] __ALIGN_END = +{ + USB_LEN_DEV_DESC, USB_DESC_TYPE_DEVICE, + 0x00, 0x02, + 0x00, 0x00, 0x00, + USB_MAX_EP0_SIZE, + LOBYTE(DFU_VID), HIBYTE(DFU_VID), + LOBYTE(DFU_PID), HIBYTE(DFU_PID), + 0x00, 0x01, + USBD_IDX_MFC_STR, + USBD_IDX_PRODUCT_STR, + USBD_IDX_SERIAL_STR, + 0x01, +}; + +__ALIGN_BEGIN static uint8_t dfuLangIdDescriptor[USB_LEN_LANGID_STR_DESC] __ALIGN_END = +{ + USB_LEN_LANGID_STR_DESC, USB_DESC_TYPE_STRING, + LOBYTE(DFU_LANGID), HIBYTE(DFU_LANGID), +}; + +__ALIGN_BEGIN static uint8_t dfuStringDescriptor[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; +__ALIGN_BEGIN static uint8_t dfuSerialDescriptor[USB_SIZ_STRING_SERIAL] __ALIGN_END = +{ + USB_SIZ_STRING_SERIAL, USB_DESC_TYPE_STRING, +}; + +static uint8_t *DFU_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(dfuDeviceDescriptor); + return dfuDeviceDescriptor; +} + +static uint8_t *DFU_LangIdDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(dfuLangIdDescriptor); + return dfuLangIdDescriptor; +} + +static uint8_t *DFU_ManufacturerDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DFU_MANUFACTURER_STRING, dfuStringDescriptor, length); + return dfuStringDescriptor; +} + +static uint8_t *DFU_ProductDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DFU_PRODUCT_STRING, dfuStringDescriptor, length); + return dfuStringDescriptor; +} + +static uint8_t *DFU_SerialDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + DFU_UpdateSerial(); + *length = sizeof(dfuSerialDescriptor); + return dfuSerialDescriptor; +} + +static uint8_t *DFU_ConfigDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DFU_CONFIG_STRING, dfuStringDescriptor, length); + return dfuStringDescriptor; +} + +static uint8_t *DFU_InterfaceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DFU_INTERFACE_STRING, dfuStringDescriptor, length); + return dfuStringDescriptor; +} + +static void DFU_UpdateSerial(void) +{ + uint32_t serial0 = *(uint32_t *)DEVICE_ID1; + uint32_t serial1 = *(uint32_t *)DEVICE_ID2; + uint32_t serial2 = *(uint32_t *)DEVICE_ID3; + + serial0 += serial2; + if (serial0 != 0U) + { + DFU_IntToUnicode(serial0, &dfuSerialDescriptor[2], 8U); + DFU_IntToUnicode(serial1, &dfuSerialDescriptor[18], 4U); + } +} + +static void DFU_IntToUnicode(uint32_t value, uint8_t *buffer, uint8_t length) +{ + uint8_t index; + for (index = 0U; index < length; index++) + { + uint8_t digit = (uint8_t)(value >> 28); + buffer[2U * index] = (digit < 10U) ? + (uint8_t)(digit + '0') : + (uint8_t)(digit - 10U + 'A'); + buffer[(2U * index) + 1U] = 0U; + value <<= 4; + } +} diff --git a/arcadestick_software/USB_DEVICE/App/usbd_desc_dinput.c b/arcadestick_software/USB_DEVICE/App/usbd_desc_dinput.c new file mode 100644 index 0000000..e668a1a --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_desc_dinput.c @@ -0,0 +1,156 @@ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_conf.h" + +#define DINPUT_VID 0x1209U +#define DINPUT_PID 0xE669U +#define DINPUT_LANGID 0x0409U +#define DINPUT_MANUFACTURER_STRING "ERTOtech" +#define DINPUT_PRODUCT_STRING "Refleks Lite DInput" +#define DINPUT_CONFIGURATION_STRING "HID Config" +#define DINPUT_INTERFACE_STRING "Gamepad" + +static uint8_t *DInput_DeviceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *DInput_LangIdDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *DInput_ManufacturerDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *DInput_ProductDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *DInput_SerialDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *DInput_ConfigurationDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *DInput_InterfaceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static void DInput_UpdateSerial(void); +static void DInput_IntToUnicode(uint32_t value, uint8_t *buffer, + uint8_t length); + +USBD_DescriptorsTypeDef FS_Desc = +{ + DInput_DeviceDescriptor, + DInput_LangIdDescriptor, + DInput_ManufacturerDescriptor, + DInput_ProductDescriptor, + DInput_SerialDescriptor, + DInput_ConfigurationDescriptor, + DInput_InterfaceDescriptor, +}; + +__ALIGN_BEGIN static uint8_t dinputDeviceDescriptor[USB_LEN_DEV_DESC] __ALIGN_END = +{ + USB_LEN_DEV_DESC, USB_DESC_TYPE_DEVICE, + 0x00, 0x02, + 0x00, 0x00, 0x00, + USB_MAX_EP0_SIZE, + LOBYTE(DINPUT_VID), HIBYTE(DINPUT_VID), + LOBYTE(DINPUT_PID), HIBYTE(DINPUT_PID), + 0x00, 0x01, + USBD_IDX_MFC_STR, + USBD_IDX_PRODUCT_STR, + USBD_IDX_SERIAL_STR, + 0x01, +}; + +__ALIGN_BEGIN static uint8_t dinputLangIdDescriptor[USB_LEN_LANGID_STR_DESC] __ALIGN_END = +{ + USB_LEN_LANGID_STR_DESC, USB_DESC_TYPE_STRING, + LOBYTE(DINPUT_LANGID), HIBYTE(DINPUT_LANGID), +}; + +__ALIGN_BEGIN static uint8_t dinputStringDescriptor[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; +__ALIGN_BEGIN static uint8_t dinputSerialDescriptor[USB_SIZ_STRING_SERIAL] __ALIGN_END = +{ + USB_SIZ_STRING_SERIAL, USB_DESC_TYPE_STRING, +}; + +static uint8_t *DInput_DeviceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(dinputDeviceDescriptor); + return dinputDeviceDescriptor; +} + +static uint8_t *DInput_LangIdDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(dinputLangIdDescriptor); + return dinputLangIdDescriptor; +} + +static uint8_t *DInput_ManufacturerDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DINPUT_MANUFACTURER_STRING, + dinputStringDescriptor, length); + return dinputStringDescriptor; +} + +static uint8_t *DInput_ProductDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DINPUT_PRODUCT_STRING, + dinputStringDescriptor, length); + return dinputStringDescriptor; +} + +static uint8_t *DInput_SerialDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + DInput_UpdateSerial(); + *length = sizeof(dinputSerialDescriptor); + return dinputSerialDescriptor; +} + +static uint8_t *DInput_ConfigurationDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DINPUT_CONFIGURATION_STRING, + dinputStringDescriptor, length); + return dinputStringDescriptor; +} + +static uint8_t *DInput_InterfaceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)DINPUT_INTERFACE_STRING, + dinputStringDescriptor, length); + return dinputStringDescriptor; +} + +static void DInput_UpdateSerial(void) +{ + uint32_t serial0 = *(uint32_t *)DEVICE_ID1; + uint32_t serial1 = *(uint32_t *)DEVICE_ID2; + uint32_t serial2 = *(uint32_t *)DEVICE_ID3; + serial0 += serial2; + if (serial0 != 0U) + { + DInput_IntToUnicode(serial0, &dinputSerialDescriptor[2], 8U); + DInput_IntToUnicode(serial1, &dinputSerialDescriptor[18], 4U); + } +} + +static void DInput_IntToUnicode(uint32_t value, uint8_t *buffer, + uint8_t length) +{ + uint8_t index; + for (index = 0U; index < length; index++) + { + uint8_t digit = (uint8_t)(value >> 28); + buffer[2U * index] = (digit < 10U) ? + (uint8_t)(digit + '0') : + (uint8_t)(digit - 10U + 'A'); + buffer[(2U * index) + 1U] = 0U; + value <<= 4; + } +} diff --git a/arcadestick_software/USB_DEVICE/App/usbd_desc_xinput.c b/arcadestick_software/USB_DEVICE/App/usbd_desc_xinput.c new file mode 100644 index 0000000..e5eed63 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_desc_xinput.c @@ -0,0 +1,159 @@ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_conf.h" + +#define XINPUT_VID 0x1209U +#define XINPUT_PID 0xE668U +#define XINPUT_LANGID 0x0409U +#define XINPUT_MANUFACTURER_STRING "ERTOtech" +#define XINPUT_PRODUCT_STRING "Refleks Lite XInput" +#define XINPUT_CONFIGURATION_STRING "XInput Config" +#define XINPUT_INTERFACE_STRING "XInput Interface" + +static uint8_t *XInput_DeviceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *XInput_LangIdDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *XInput_ManufacturerDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *XInput_ProductDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *XInput_SerialDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *XInput_ConfigurationDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static uint8_t *XInput_InterfaceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length); +static void XInput_UpdateSerial(void); +static void XInput_IntToUnicode(uint32_t value, uint8_t *buffer, uint8_t length); + +USBD_DescriptorsTypeDef FS_Desc = +{ + XInput_DeviceDescriptor, + XInput_LangIdDescriptor, + XInput_ManufacturerDescriptor, + XInput_ProductDescriptor, + XInput_SerialDescriptor, + XInput_ConfigurationDescriptor, + XInput_InterfaceDescriptor, +}; + +__ALIGN_BEGIN static uint8_t xinputDeviceDescriptor[USB_LEN_DEV_DESC] __ALIGN_END = +{ + USB_LEN_DEV_DESC, + USB_DESC_TYPE_DEVICE, + 0x00, 0x02, /* USB 2.00 */ + 0x00, 0x00, 0x00, /* Class is defined by the interface */ + USB_MAX_EP0_SIZE, + LOBYTE(XINPUT_VID), HIBYTE(XINPUT_VID), + LOBYTE(XINPUT_PID), HIBYTE(XINPUT_PID), + 0x01, 0x01, /* Device release 1.01 */ + USBD_IDX_MFC_STR, + USBD_IDX_PRODUCT_STR, + USBD_IDX_SERIAL_STR, + 0x01, +}; + +__ALIGN_BEGIN static uint8_t xinputLangIdDescriptor[USB_LEN_LANGID_STR_DESC] __ALIGN_END = +{ + USB_LEN_LANGID_STR_DESC, + USB_DESC_TYPE_STRING, + LOBYTE(XINPUT_LANGID), HIBYTE(XINPUT_LANGID), +}; + +__ALIGN_BEGIN static uint8_t xinputStringDescriptor[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; +__ALIGN_BEGIN static uint8_t xinputSerialDescriptor[USB_SIZ_STRING_SERIAL] __ALIGN_END = +{ + USB_SIZ_STRING_SERIAL, + USB_DESC_TYPE_STRING, +}; + +static uint8_t *XInput_DeviceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(xinputDeviceDescriptor); + return xinputDeviceDescriptor; +} + +static uint8_t *XInput_LangIdDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + *length = sizeof(xinputLangIdDescriptor); + return xinputLangIdDescriptor; +} + +static uint8_t *XInput_ManufacturerDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)XINPUT_MANUFACTURER_STRING, + xinputStringDescriptor, length); + return xinputStringDescriptor; +} + +static uint8_t *XInput_ProductDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)XINPUT_PRODUCT_STRING, + xinputStringDescriptor, length); + return xinputStringDescriptor; +} + +static uint8_t *XInput_SerialDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + XInput_UpdateSerial(); + *length = sizeof(xinputSerialDescriptor); + return xinputSerialDescriptor; +} + +static uint8_t *XInput_ConfigurationDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)XINPUT_CONFIGURATION_STRING, + xinputStringDescriptor, length); + return xinputStringDescriptor; +} + +static uint8_t *XInput_InterfaceDescriptor(USBD_SpeedTypeDef speed, + uint16_t *length) +{ + UNUSED(speed); + USBD_GetString((uint8_t *)XINPUT_INTERFACE_STRING, + xinputStringDescriptor, length); + return xinputStringDescriptor; +} + +static void XInput_UpdateSerial(void) +{ + uint32_t serial0 = *(uint32_t *)DEVICE_ID1; + uint32_t serial1 = *(uint32_t *)DEVICE_ID2; + uint32_t serial2 = *(uint32_t *)DEVICE_ID3; + + serial0 += serial2; + if (serial0 != 0U) + { + XInput_IntToUnicode(serial0, &xinputSerialDescriptor[2], 8U); + XInput_IntToUnicode(serial1, &xinputSerialDescriptor[18], 4U); + } +} + +static void XInput_IntToUnicode(uint32_t value, uint8_t *buffer, uint8_t length) +{ + uint8_t index; + + for (index = 0U; index < length; index++) + { + uint8_t digit = (uint8_t)(value >> 28); + buffer[2U * index] = (digit < 10U) ? + (uint8_t)(digit + '0') : + (uint8_t)(digit - 10U + 'A'); + buffer[(2U * index) + 1U] = 0U; + value <<= 4; + } +} diff --git a/arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.c b/arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.c new file mode 100644 index 0000000..ca0fb82 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.c @@ -0,0 +1,369 @@ +#include "usbd_dfu_bootloader.h" + +#include "stm32f1xx_hal.h" +#include "usbd_ctlreq.h" + +#define DFU_DETACH 0x00U +#define DFU_DNLOAD 0x01U +#define DFU_UPLOAD 0x02U +#define DFU_GETSTATUS 0x03U +#define DFU_CLRSTATUS 0x04U +#define DFU_GETSTATE 0x05U +#define DFU_ABORT 0x06U + +#define DFU_STATUS_OK 0x00U +#define DFU_STATUS_ERR_WRITE 0x03U +#define DFU_STATUS_ERR_ERASE 0x04U +#define DFU_STATUS_ERR_ADDRESS 0x08U +#define DFU_STATUS_ERR_STALLEDPKT 0x0FU + +#define DFU_STATE_DFU_IDLE 0x02U +#define DFU_STATE_DFU_DNLOAD_SYNC 0x03U +#define DFU_STATE_DFU_DNLOAD_IDLE 0x05U +#define DFU_STATE_DFU_MANIFEST_SYNC 0x06U +#define DFU_STATE_DFU_MANIFEST_WAIT_RESET 0x08U +#define DFU_STATE_DFU_ERROR 0x0AU + +#define DFU_DESCRIPTOR_TYPE 0x21U +#define STM32F103_FLASH_PAGE_SIZE 1024U + +typedef struct +{ + uint8_t state; + uint8_t status; + uint8_t altSetting; + uint8_t resetPending; + uint16_t blockNumber; + uint16_t downloadLength; + uint32_t resetAt; +} USBD_DFU_BootloaderHandleTypeDef; + +static uint8_t DFU_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t DFU_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t DFU_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t DFU_EP0RxReady(USBD_HandleTypeDef *pdev); +static uint8_t DFU_SOF(USBD_HandleTypeDef *pdev); +static uint8_t *DFU_GetCfgDesc(uint16_t *length); +static uint8_t *DFU_GetDeviceQualifierDesc(uint16_t *length); +static uint8_t DFU_WriteBlock(USBD_DFU_BootloaderHandleTypeDef *handle); +static uint32_t DFU_GetSlotBase(uint8_t altSetting); + +__ALIGN_BEGIN static uint32_t dfuDownloadWords[DFU_TRANSFER_SIZE / 4U] __ALIGN_END; + +USBD_ClassTypeDef USBD_DFU_BOOTLOADER = +{ + DFU_Init, + DFU_DeInit, + DFU_Setup, + NULL, + DFU_EP0RxReady, + NULL, + NULL, + DFU_SOF, + NULL, + NULL, + DFU_GetCfgDesc, + DFU_GetCfgDesc, + DFU_GetCfgDesc, + DFU_GetDeviceQualifierDesc, +}; + +/* One DFU interface with two alternate settings: App1 and App2. */ +__ALIGN_BEGIN static uint8_t dfuConfigDescriptor[USB_DFU_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, USB_DESC_TYPE_CONFIGURATION, + LOBYTE(USB_DFU_CONFIG_DESC_SIZ), HIBYTE(USB_DFU_CONFIG_DESC_SIZ), + 0x01, 0x01, 0x00, 0x80, 0x32, + + 0x09, USB_DESC_TYPE_INTERFACE, + 0x00, 0x00, 0x00, + 0xFE, 0x01, 0x02, 0x00, + + /* DFU 1.1 functional descriptor: download only, 1024-byte transfer. */ + 0x09, DFU_DESCRIPTOR_TYPE, + 0x01, + 0xE8, 0x03, + LOBYTE(DFU_TRANSFER_SIZE), HIBYTE(DFU_TRANSFER_SIZE), + 0x10, 0x01, + + 0x09, USB_DESC_TYPE_INTERFACE, + 0x00, 0x01, 0x00, + 0xFE, 0x01, 0x02, 0x00, +}; + +__ALIGN_BEGIN static uint8_t dfuDeviceQualifierDescriptor[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, 0x02, + 0x00, 0x00, 0x00, + USB_MAX_EP0_SIZE, + 0x01, 0x00, +}; + +static uint8_t DFU_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + USBD_DFU_BootloaderHandleTypeDef *handle; + + UNUSED(cfgidx); + pdev->pClassData = USBD_malloc(sizeof(USBD_DFU_BootloaderHandleTypeDef)); + if (pdev->pClassData == NULL) + { + return USBD_FAIL; + } + + handle = (USBD_DFU_BootloaderHandleTypeDef *)pdev->pClassData; + handle->state = DFU_STATE_DFU_IDLE; + handle->status = DFU_STATUS_OK; + handle->altSetting = 0U; + handle->resetPending = 0U; + handle->blockNumber = 0U; + handle->downloadLength = 0U; + handle->resetAt = 0U; + return USBD_OK; +} + +static uint8_t DFU_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + if (pdev->pClassData != NULL) + { + USBD_free(pdev->pClassData); + pdev->pClassData = NULL; + } + return USBD_OK; +} + +static uint8_t DFU_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + USBD_DFU_BootloaderHandleTypeDef *handle = + (USBD_DFU_BootloaderHandleTypeDef *)pdev->pClassData; + static uint8_t statusResponse[6]; + uint16_t statusInfo = 0U; + + if (handle == NULL) + { + USBD_CtlError(pdev, req); + return USBD_FAIL; + } + + if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_CLASS) + { + switch (req->bRequest) + { + case DFU_DNLOAD: + if ((handle->state != DFU_STATE_DFU_IDLE) && + (handle->state != DFU_STATE_DFU_DNLOAD_IDLE)) + { + break; + } + if (req->wLength == 0U) + { + handle->state = DFU_STATE_DFU_MANIFEST_SYNC; + return USBD_OK; + } + if (req->wLength > DFU_TRANSFER_SIZE) + { + handle->status = DFU_STATUS_ERR_STALLEDPKT; + handle->state = DFU_STATE_DFU_ERROR; + break; + } + handle->blockNumber = req->wValue; + handle->downloadLength = req->wLength; + USBD_CtlPrepareRx(pdev, (uint8_t *)dfuDownloadWords, req->wLength); + return USBD_OK; + + case DFU_UPLOAD: + break; + + case DFU_GETSTATUS: + if (handle->state == DFU_STATE_DFU_DNLOAD_SYNC) + { + handle->state = DFU_STATE_DFU_DNLOAD_IDLE; + } + else if (handle->state == DFU_STATE_DFU_MANIFEST_SYNC) + { + handle->state = DFU_STATE_DFU_MANIFEST_WAIT_RESET; + handle->resetPending = 1U; + handle->resetAt = HAL_GetTick() + 100U; + } + statusResponse[0] = handle->status; + statusResponse[1] = 0U; + statusResponse[2] = 0U; + statusResponse[3] = 0U; + statusResponse[4] = handle->state; + statusResponse[5] = 0U; + USBD_CtlSendData(pdev, statusResponse, sizeof(statusResponse)); + return USBD_OK; + + case DFU_CLRSTATUS: + handle->status = DFU_STATUS_OK; + handle->state = DFU_STATE_DFU_IDLE; + return USBD_OK; + + case DFU_GETSTATE: + USBD_CtlSendData(pdev, &handle->state, 1U); + return USBD_OK; + + case DFU_ABORT: + handle->status = DFU_STATUS_OK; + handle->state = DFU_STATE_DFU_IDLE; + handle->downloadLength = 0U; + return USBD_OK; + + case DFU_DETACH: + handle->resetPending = 1U; + handle->resetAt = HAL_GetTick() + 100U; + return USBD_OK; + + default: + break; + } + } + else if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD) + { + switch (req->bRequest) + { + case USB_REQ_GET_STATUS: + USBD_CtlSendData(pdev, (uint8_t *)&statusInfo, sizeof(statusInfo)); + return USBD_OK; + + case USB_REQ_GET_INTERFACE: + USBD_CtlSendData(pdev, &handle->altSetting, 1U); + return USBD_OK; + + case USB_REQ_SET_INTERFACE: + if (req->wValue <= 1U) + { + handle->altSetting = (uint8_t)req->wValue; + handle->state = DFU_STATE_DFU_IDLE; + handle->status = DFU_STATUS_OK; + return USBD_OK; + } + break; + + case USB_REQ_GET_DESCRIPTOR: + if ((req->wValue >> 8) == DFU_DESCRIPTOR_TYPE) + { + USBD_CtlSendData(pdev, &dfuConfigDescriptor[18], + MIN(9U, req->wLength)); + return USBD_OK; + } + break; + + default: + break; + } + } + + USBD_CtlError(pdev, req); + return USBD_FAIL; +} + +static uint8_t DFU_EP0RxReady(USBD_HandleTypeDef *pdev) +{ + USBD_DFU_BootloaderHandleTypeDef *handle = + (USBD_DFU_BootloaderHandleTypeDef *)pdev->pClassData; + + if ((handle == NULL) || (handle->downloadLength == 0U)) + { + return USBD_OK; + } + + if (DFU_WriteBlock(handle) == USBD_OK) + { + handle->status = DFU_STATUS_OK; + handle->state = DFU_STATE_DFU_DNLOAD_SYNC; + } + else + { + handle->state = DFU_STATE_DFU_ERROR; + } + handle->downloadLength = 0U; + return USBD_OK; +} + +static uint8_t DFU_SOF(USBD_HandleTypeDef *pdev) +{ + USBD_DFU_BootloaderHandleTypeDef *handle = + (USBD_DFU_BootloaderHandleTypeDef *)pdev->pClassData; + + if ((handle != NULL) && (handle->resetPending != 0U) && + ((int32_t)(HAL_GetTick() - handle->resetAt) >= 0)) + { + NVIC_SystemReset(); + } + return USBD_OK; +} + +static uint8_t DFU_WriteBlock(USBD_DFU_BootloaderHandleTypeDef *handle) +{ + FLASH_EraseInitTypeDef erase = {0}; + uint32_t eraseError = 0U; + uint32_t slotBase = DFU_GetSlotBase(handle->altSetting); + uint32_t address = slotBase + ((uint32_t)handle->blockNumber * DFU_TRANSFER_SIZE); + uint32_t slotEnd = slotBase + DFU_APP_SLOT_SIZE; + uint32_t index; + + if ((address < slotBase) || (address >= slotEnd) || + (handle->downloadLength > (slotEnd - address))) + { + handle->status = DFU_STATUS_ERR_ADDRESS; + return USBD_FAIL; + } + + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR); + + erase.TypeErase = FLASH_TYPEERASE_PAGES; + erase.PageAddress = address; + erase.NbPages = 1U; + if (HAL_FLASHEx_Erase(&erase, &eraseError) != HAL_OK) + { + handle->status = DFU_STATUS_ERR_ERASE; + HAL_FLASH_Lock(); + return USBD_FAIL; + } + + for (index = 0U; index < handle->downloadLength; index += 2U) + { + uint8_t *bytes = (uint8_t *)dfuDownloadWords; + uint16_t halfword = bytes[index]; + if ((index + 1U) < handle->downloadLength) + { + halfword |= (uint16_t)((uint16_t)bytes[index + 1U] << 8U); + } + else + { + halfword |= 0xFF00U; + } + + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, + address + index, halfword) != HAL_OK) + { + handle->status = DFU_STATUS_ERR_WRITE; + HAL_FLASH_Lock(); + return USBD_FAIL; + } + } + + HAL_FLASH_Lock(); + return USBD_OK; +} + +static uint32_t DFU_GetSlotBase(uint8_t altSetting) +{ + return (altSetting == 0U) ? DFU_APP1_ADDRESS : DFU_APP2_ADDRESS; +} + +static uint8_t *DFU_GetCfgDesc(uint16_t *length) +{ + *length = sizeof(dfuConfigDescriptor); + return dfuConfigDescriptor; +} + +static uint8_t *DFU_GetDeviceQualifierDesc(uint16_t *length) +{ + *length = sizeof(dfuDeviceQualifierDescriptor); + return dfuDeviceQualifierDescriptor; +} diff --git a/arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.h b/arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.h new file mode 100644 index 0000000..e76dd91 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_dfu_bootloader.h @@ -0,0 +1,22 @@ +#ifndef USBD_DFU_BOOTLOADER_H +#define USBD_DFU_BOOTLOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_ioreq.h" + +#define DFU_TRANSFER_SIZE 1024U +#define DFU_APP1_ADDRESS 0x08006000U +#define DFU_APP2_ADDRESS 0x08013000U +#define DFU_APP_SLOT_SIZE 0x0000D000U +#define USB_DFU_CONFIG_DESC_SIZ 36U + +extern USBD_ClassTypeDef USBD_DFU_BOOTLOADER; + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_DFU_BOOTLOADER_H */ diff --git a/arcadestick_software/USB_DEVICE/App/usbd_dinput.c b/arcadestick_software/USB_DEVICE/App/usbd_dinput.c new file mode 100644 index 0000000..4fdd7b1 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_dinput.c @@ -0,0 +1,390 @@ +#include "usbd_dinput.h" + +#include "usbd_ctlreq.h" +#include + +#define HID_DESCRIPTOR_TYPE 0x21U +#define HID_REPORT_DESC 0x22U +#define HID_REQ_GET_REPORT 0x01U +#define HID_REQ_GET_IDLE 0x02U +#define HID_REQ_GET_PROTOCOL 0x03U +#define HID_REQ_SET_REPORT 0x09U +#define HID_REQ_SET_IDLE 0x0AU +#define HID_REQ_SET_PROTOCOL 0x0BU + +typedef struct +{ + uint8_t altSetting[3]; + uint8_t protocol; + uint8_t idle; + uint8_t busy; +} USBD_DINPUT_HandleTypeDef; + +static uint8_t DINPUT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t DINPUT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t DINPUT_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); +static uint8_t DINPUT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t DINPUT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t *DINPUT_GetCfgDesc(uint16_t *length); +static uint8_t *DINPUT_GetDeviceQualifierDesc(uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t *DINPUT_GetUserString(USBD_HandleTypeDef *pdev, + uint8_t index, + uint16_t *length); +#endif + +static uint8_t dinputInBuffer[DINPUT_REPORT_SIZE]; +static uint8_t dinputSetupOutBuffer[DINPUT_EP_SIZE]; +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t dinputStringBuffer[32]; +#endif + +USBD_ClassTypeDef USBD_DINPUT = +{ + DINPUT_Init, + DINPUT_DeInit, + DINPUT_Setup, + NULL, + NULL, + DINPUT_DataIn, + DINPUT_DataOut, + NULL, + NULL, + NULL, + DINPUT_GetCfgDesc, + DINPUT_GetCfgDesc, + DINPUT_GetCfgDesc, + DINPUT_GetDeviceQualifierDesc, +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + DINPUT_GetUserString, +#endif +}; + +/* Descriptor order and report sizes match the original three-interface unit. + * IF0 is the only functional interface. IF1/IF2 are inert compatibility + * shells and their data endpoints are halted in DINPUT_Init(). */ +__ALIGN_BEGIN static uint8_t dinputConfigDescriptor[USB_DINPUT_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, USB_DESC_TYPE_CONFIGURATION, + LOBYTE(USB_DINPUT_CONFIG_DESC_SIZ), HIBYTE(USB_DINPUT_CONFIG_DESC_SIZ), + 0x03, 0x01, 0x00, 0x80, 0x32, + + 0x09, USB_DESC_TYPE_INTERFACE, + 0x00, 0x00, 0x01, + 0x03, 0x00, 0x00, 0x05, + 0x09, HID_DESCRIPTOR_TYPE, + 0x11, 0x01, 0x00, 0x01, HID_REPORT_DESC, + 0x51, 0x00, + 0x07, USB_DESC_TYPE_ENDPOINT, + DINPUT_GAMEPAD_EPIN_ADDR, 0x03, + LOBYTE(DINPUT_EP_SIZE), HIBYTE(DINPUT_EP_SIZE), 0x01, + + 0x09, USB_DESC_TYPE_INTERFACE, + 0x01, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x06, + 0x09, HID_DESCRIPTOR_TYPE, + 0x11, 0x01, 0x00, 0x01, HID_REPORT_DESC, + 0x22, 0x00, + 0x07, USB_DESC_TYPE_ENDPOINT, + DINPUT_SETUP_EPIN_ADDR, 0x03, + LOBYTE(DINPUT_EP_SIZE), HIBYTE(DINPUT_EP_SIZE), 0x01, + 0x07, USB_DESC_TYPE_ENDPOINT, + DINPUT_SETUP_EPOUT_ADDR, 0x03, + LOBYTE(DINPUT_EP_SIZE), HIBYTE(DINPUT_EP_SIZE), 0x01, + + 0x09, USB_DESC_TYPE_INTERFACE, + 0x02, 0x00, 0x01, + 0x03, 0x00, 0x00, 0x07, + 0x09, HID_DESCRIPTOR_TYPE, + 0x11, 0x01, 0x00, 0x01, HID_REPORT_DESC, + 0x15, 0x00, + 0x07, USB_DESC_TYPE_ENDPOINT, + DINPUT_RAW_EPIN_ADDR, 0x03, + LOBYTE(DINPUT_EP_SIZE), HIBYTE(DINPUT_EP_SIZE), 0x01, +}; + +/* 11 buttons, hat and six unsigned 8-bit axes: 9 bytes total. */ +__ALIGN_BEGIN static uint8_t gamepadReportDescriptor[] __ALIGN_END = +{ + 0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, + 0x05, 0x09, 0x19, 0x01, 0x29, 0x0B, + 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, + 0x95, 0x0B, 0x81, 0x02, + 0x75, 0x01, 0x95, 0x05, 0x81, 0x03, + 0x05, 0x01, 0x09, 0x39, 0x15, 0x00, + 0x25, 0x07, 0x35, 0x00, 0x46, 0x3B, 0x01, + 0x65, 0x14, 0x75, 0x04, 0x95, 0x01, + 0x81, 0x42, 0x75, 0x04, 0x95, 0x01, 0x81, 0x03, + 0x05, 0x01, + 0x09, 0x30, 0x09, 0x31, 0x09, 0x32, + 0x09, 0x33, 0x09, 0x34, 0x09, 0x35, + 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x06, 0x81, 0x02, + 0xC0 +}; + +__ALIGN_BEGIN static uint8_t setupReportDescriptor[] __ALIGN_END = +{ + 0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, + 0x09, 0x10, 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x1A, 0x81, 0x02, + 0x09, 0x11, 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x1B, 0x91, 0x02, + 0xC0 +}; + +__ALIGN_BEGIN static uint8_t rawReportDescriptor[] __ALIGN_END = +{ + 0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, + 0x09, 0x20, 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x18, 0x81, 0x02, + 0xC0 +}; + +__ALIGN_BEGIN static uint8_t dinputDeviceQualifierDescriptor[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, 0x02, 0x00, 0x00, 0x00, USB_MAX_EP0_SIZE, 0x01, 0x00 +}; + +_Static_assert(sizeof(gamepadReportDescriptor) == 81U, + "DInput gamepad report descriptor length changed"); +_Static_assert(sizeof(setupReportDescriptor) == 34U, + "Setup report descriptor length changed"); +_Static_assert(sizeof(rawReportDescriptor) == 21U, + "Raw report descriptor length changed"); + +static uint8_t DINPUT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + USBD_DINPUT_HandleTypeDef *handle; + UNUSED(cfgidx); + + pdev->pClassData = USBD_malloc(sizeof(USBD_DINPUT_HandleTypeDef)); + if (pdev->pClassData == NULL) + { + return USBD_FAIL; + } + handle = (USBD_DINPUT_HandleTypeDef *)pdev->pClassData; + memset(handle, 0, sizeof(*handle)); + + USBD_LL_OpenEP(pdev, DINPUT_GAMEPAD_EPIN_ADDR, + USBD_EP_TYPE_INTR, DINPUT_EP_SIZE); + pdev->ep_in[DINPUT_GAMEPAD_EPIN_ADDR & 0x0FU].is_used = 1U; + + USBD_LL_OpenEP(pdev, DINPUT_SETUP_EPIN_ADDR, + USBD_EP_TYPE_INTR, DINPUT_EP_SIZE); + pdev->ep_in[DINPUT_SETUP_EPIN_ADDR & 0x0FU].is_used = 1U; + USBD_LL_OpenEP(pdev, DINPUT_SETUP_EPOUT_ADDR, + USBD_EP_TYPE_INTR, DINPUT_EP_SIZE); + pdev->ep_out[DINPUT_SETUP_EPOUT_ADDR & 0x0FU].is_used = 1U; + USBD_LL_OpenEP(pdev, DINPUT_RAW_EPIN_ADDR, + USBD_EP_TYPE_INTR, DINPUT_EP_SIZE); + pdev->ep_in[DINPUT_RAW_EPIN_ADDR & 0x0FU].is_used = 1U; + + /* Stub HID data paths: unused IN endpoints stay at NAK. Setup OUT packets + * are acknowledged and discarded so the interface can start cleanly. */ + USBD_LL_PrepareReceive(pdev, DINPUT_SETUP_EPOUT_ADDR, + dinputSetupOutBuffer, DINPUT_EP_SIZE); + return USBD_OK; +} + +static uint8_t DINPUT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + USBD_LL_CloseEP(pdev, DINPUT_GAMEPAD_EPIN_ADDR); + USBD_LL_CloseEP(pdev, DINPUT_SETUP_EPIN_ADDR); + USBD_LL_CloseEP(pdev, DINPUT_SETUP_EPOUT_ADDR); + USBD_LL_CloseEP(pdev, DINPUT_RAW_EPIN_ADDR); + pdev->ep_in[DINPUT_GAMEPAD_EPIN_ADDR & 0x0FU].is_used = 0U; + pdev->ep_in[DINPUT_SETUP_EPIN_ADDR & 0x0FU].is_used = 0U; + pdev->ep_out[DINPUT_SETUP_EPOUT_ADDR & 0x0FU].is_used = 0U; + pdev->ep_in[DINPUT_RAW_EPIN_ADDR & 0x0FU].is_used = 0U; + if (pdev->pClassData != NULL) + { + USBD_free(pdev->pClassData); + pdev->pClassData = NULL; + } + return USBD_OK; +} + +static uint8_t DINPUT_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + USBD_DINPUT_HandleTypeDef *handle = + (USBD_DINPUT_HandleTypeDef *)pdev->pClassData; + uint8_t interface = (uint8_t)req->wIndex; + uint16_t status = 0U; + uint8_t *descriptor = NULL; + uint16_t length = 0U; + + if ((handle == NULL) || (interface > 2U)) + { + USBD_CtlError(pdev, req); + return USBD_FAIL; + } + + if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_CLASS) + { + /* The original Setup/Raw protocols are intentionally not implemented. */ + if (interface != 0U) + { + USBD_CtlError(pdev, req); + return USBD_FAIL; + } + + switch (req->bRequest) + { + case HID_REQ_SET_PROTOCOL: + handle->protocol = (uint8_t)req->wValue; + return USBD_OK; + case HID_REQ_GET_PROTOCOL: + USBD_CtlSendData(pdev, &handle->protocol, 1U); + return USBD_OK; + case HID_REQ_SET_IDLE: + handle->idle = (uint8_t)(req->wValue >> 8); + return USBD_OK; + case HID_REQ_GET_IDLE: + USBD_CtlSendData(pdev, &handle->idle, 1U); + return USBD_OK; + case HID_REQ_GET_REPORT: + case HID_REQ_SET_REPORT: + default: + USBD_CtlError(pdev, req); + return USBD_FAIL; + } + } + + if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD) + { + switch (req->bRequest) + { + case USB_REQ_GET_STATUS: + USBD_CtlSendData(pdev, (uint8_t *)&status, sizeof(status)); + return USBD_OK; + case USB_REQ_GET_INTERFACE: + USBD_CtlSendData(pdev, &handle->altSetting[interface], 1U); + return USBD_OK; + case USB_REQ_SET_INTERFACE: + if (req->wValue == 0U) + { + handle->altSetting[interface] = 0U; + return USBD_OK; + } + break; + case USB_REQ_GET_DESCRIPTOR: + if ((req->wValue >> 8) == HID_REPORT_DESC) + { + if (interface == 0U) + { + descriptor = gamepadReportDescriptor; + length = sizeof(gamepadReportDescriptor); + } + else if (interface == 1U) + { + descriptor = setupReportDescriptor; + length = sizeof(setupReportDescriptor); + } + else + { + descriptor = rawReportDescriptor; + length = sizeof(rawReportDescriptor); + } + } + else if ((req->wValue >> 8) == HID_DESCRIPTOR_TYPE) + { + static const uint8_t hidOffsets[3] = {18U, 43U, 75U}; + descriptor = &dinputConfigDescriptor[hidOffsets[interface]]; + length = 9U; + } + if (descriptor != NULL) + { + USBD_CtlSendData(pdev, descriptor, MIN(length, req->wLength)); + return USBD_OK; + } + break; + default: + break; + } + } + + USBD_CtlError(pdev, req); + return USBD_FAIL; +} + +uint8_t USBD_DINPUT_SendReport(USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len) +{ + USBD_DINPUT_HandleTypeDef *handle = + (USBD_DINPUT_HandleTypeDef *)pdev->pClassData; + if ((pdev->dev_state == USBD_STATE_CONFIGURED) && + (handle != NULL) && (handle->busy == 0U) && + (len == DINPUT_REPORT_SIZE)) + { + handle->busy = 1U; + memcpy(dinputInBuffer, report, DINPUT_REPORT_SIZE); + return USBD_LL_Transmit(pdev, DINPUT_GAMEPAD_EPIN_ADDR, + dinputInBuffer, len); + } + return USBD_OK; +} + +static uint8_t DINPUT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + if ((epnum == (DINPUT_GAMEPAD_EPIN_ADDR & 0x0FU)) && + (pdev->pClassData != NULL)) + { + ((USBD_DINPUT_HandleTypeDef *)pdev->pClassData)->busy = 0U; + return USBD_OK; + } + return USBD_FAIL; +} + +static uint8_t DINPUT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + if (epnum == (DINPUT_SETUP_EPOUT_ADDR & 0x0FU)) + { + USBD_LL_PrepareReceive(pdev, DINPUT_SETUP_EPOUT_ADDR, + dinputSetupOutBuffer, DINPUT_EP_SIZE); + return USBD_OK; + } + return USBD_FAIL; +} + +static uint8_t *DINPUT_GetCfgDesc(uint16_t *length) +{ + *length = sizeof(dinputConfigDescriptor); + return dinputConfigDescriptor; +} + +static uint8_t *DINPUT_GetDeviceQualifierDesc(uint16_t *length) +{ + *length = sizeof(dinputDeviceQualifierDescriptor); + return dinputDeviceQualifierDescriptor; +} + +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t *DINPUT_GetUserString(USBD_HandleTypeDef *pdev, + uint8_t index, + uint16_t *length) +{ + const char *text; + UNUSED(pdev); + if (index == 0x06U) + { + text = "Setup"; + } + else if (index == 0x07U) + { + text = "Raw"; + } + else + { + *length = 0U; + return NULL; + } + USBD_GetString((uint8_t *)text, dinputStringBuffer, length); + return dinputStringBuffer; +} +#endif diff --git a/arcadestick_software/USB_DEVICE/App/usbd_dinput.h b/arcadestick_software/USB_DEVICE/App/usbd_dinput.h new file mode 100644 index 0000000..705bdea --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_dinput.h @@ -0,0 +1,28 @@ +#ifndef USBD_DINPUT_H +#define USBD_DINPUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +#define DINPUT_GAMEPAD_EPIN_ADDR 0x81U +#define DINPUT_SETUP_EPIN_ADDR 0x82U +#define DINPUT_SETUP_EPOUT_ADDR 0x02U +#define DINPUT_RAW_EPIN_ADDR 0x83U +#define DINPUT_EP_SIZE 64U +#define DINPUT_REPORT_SIZE 9U +#define USB_DINPUT_CONFIG_DESC_SIZ 91U + +extern USBD_ClassTypeDef USBD_DINPUT; + +uint8_t USBD_DINPUT_SendReport(USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_DINPUT_H */ diff --git a/arcadestick_software/USB_DEVICE/App/usbd_xinput.c b/arcadestick_software/USB_DEVICE/App/usbd_xinput.c new file mode 100644 index 0000000..4c7a2cd --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_xinput.c @@ -0,0 +1,437 @@ +#include "usbd_xinput.h" + +#include "usbd_ctlreq.h" +#include + +static uint8_t USBD_XINPUT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t USBD_XINPUT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t USBD_XINPUT_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); +static uint8_t USBD_XINPUT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t USBD_XINPUT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t *USBD_XINPUT_GetCfgDesc(uint16_t *length); +static uint8_t *USBD_XINPUT_GetDeviceQualifierDesc(uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t *USBD_XINPUT_GetUserString(USBD_HandleTypeDef *pdev, + uint8_t index, + uint16_t *length); +#endif + +static uint8_t xinputOutBuffer[XINPUT_EP_SIZE]; +static uint8_t xinputSetupOutBuffer[XINPUT_EP_SIZE]; +static uint8_t xinputInBuffer[XINPUT_REPORT_SIZE]; +static volatile uint8_t rumbleLeft; +static volatile uint8_t rumbleRight; +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t xinputStringBuffer[32]; +#endif + +USBD_ClassTypeDef USBD_XINPUT = +{ + USBD_XINPUT_Init, + USBD_XINPUT_DeInit, + USBD_XINPUT_Setup, + NULL, + NULL, + USBD_XINPUT_DataIn, + USBD_XINPUT_DataOut, + NULL, + NULL, + NULL, + USBD_XINPUT_GetCfgDesc, + USBD_XINPUT_GetCfgDesc, + USBD_XINPUT_GetCfgDesc, + USBD_XINPUT_GetDeviceQualifierDesc, +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + USBD_XINPUT_GetUserString, +#endif +}; + +/* Original three-interface layout. Only IF0 implements device behavior. */ +__ALIGN_BEGIN static uint8_t USBD_XINPUT_CfgDesc[USB_XINPUT_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, USB_DESC_TYPE_CONFIGURATION, + LOBYTE(USB_XINPUT_CONFIG_DESC_SIZ), HIBYTE(USB_XINPUT_CONFIG_DESC_SIZ), + 0x03, /* bNumInterfaces */ + 0x01, /* bConfigurationValue */ + 0x00, /* iConfiguration */ + 0x80, /* Bus powered */ + 0x32, /* 100 mA */ + + 0x09, USB_DESC_TYPE_INTERFACE, + 0x00, /* bInterfaceNumber */ + 0x00, /* bAlternateSetting */ + 0x02, /* bNumEndpoints */ + 0xFF, /* Vendor specific */ + 0x5D, /* XUSB */ + 0x01, /* Xbox 360 wired controller */ + 0x00, /* iInterface */ + + /* XUSB class-specific descriptor from the working controller firmware. */ + 0x11, 0x21, 0x10, 0x01, 0x01, 0x25, 0x81, 0x14, + 0x03, 0x03, 0x03, 0x04, 0x13, 0x02, 0x08, 0x03, 0x03, + + 0x07, USB_DESC_TYPE_ENDPOINT, + XINPUT_EPIN_ADDR, + 0x03, /* Interrupt */ + LOBYTE(XINPUT_EP_SIZE), HIBYTE(XINPUT_EP_SIZE), + 0x01, + + 0x07, USB_DESC_TYPE_ENDPOINT, + XINPUT_EPOUT_ADDR, + 0x03, /* Interrupt */ + LOBYTE(XINPUT_EP_SIZE), HIBYTE(XINPUT_EP_SIZE), + 0x01, + + /* IF1: descriptor-compatible Setup HID; data path intentionally stalled. */ + 0x09, USB_DESC_TYPE_INTERFACE, + 0x01, 0x00, 0x02, + 0x03, 0x00, 0x00, 0x06, + 0x09, 0x21, + 0x11, 0x01, 0x00, 0x01, 0x22, + 0x22, 0x00, + 0x07, USB_DESC_TYPE_ENDPOINT, + XINPUT_SETUP_EPIN_ADDR, 0x03, + LOBYTE(XINPUT_EP_SIZE), HIBYTE(XINPUT_EP_SIZE), 0x01, + 0x07, USB_DESC_TYPE_ENDPOINT, + XINPUT_SETUP_EPOUT_ADDR, 0x03, + LOBYTE(XINPUT_EP_SIZE), HIBYTE(XINPUT_EP_SIZE), 0x01, + + /* IF2: descriptor-compatible Raw HID; data path intentionally stalled. */ + 0x09, USB_DESC_TYPE_INTERFACE, + 0x02, 0x00, 0x01, + 0x03, 0x00, 0x00, 0x07, + 0x09, 0x21, + 0x11, 0x01, 0x00, 0x01, 0x22, + 0x15, 0x00, + 0x07, USB_DESC_TYPE_ENDPOINT, + XINPUT_RAW_EPIN_ADDR, 0x03, + LOBYTE(XINPUT_EP_SIZE), HIBYTE(XINPUT_EP_SIZE), 0x01, +}; + +__ALIGN_BEGIN static uint8_t xinputSetupReportDescriptor[] __ALIGN_END = +{ + 0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, + 0x09, 0x10, 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x1A, 0x81, 0x02, + 0x09, 0x11, 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x1B, 0x91, 0x02, + 0xC0 +}; + +__ALIGN_BEGIN static uint8_t xinputRawReportDescriptor[] __ALIGN_END = +{ + 0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, + 0x09, 0x20, 0x15, 0x00, 0x26, 0xFF, 0x00, + 0x75, 0x08, 0x95, 0x18, 0x81, 0x02, + 0xC0 +}; + +_Static_assert(sizeof(xinputSetupReportDescriptor) == 34U, + "Setup report descriptor length changed"); +_Static_assert(sizeof(xinputRawReportDescriptor) == 21U, + "Raw report descriptor length changed"); + +__ALIGN_BEGIN static uint8_t USBD_XINPUT_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, 0x02, + 0x00, 0x00, 0x00, + USB_MAX_EP0_SIZE, + 0x01, + 0x00, +}; + +static uint8_t USBD_XINPUT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + USBD_XINPUT_HandleTypeDef *handle; + + UNUSED(cfgidx); + + USBD_LL_OpenEP(pdev, XINPUT_EPIN_ADDR, USBD_EP_TYPE_INTR, XINPUT_EP_SIZE); + pdev->ep_in[XINPUT_EPIN_ADDR & 0x0FU].is_used = 1U; + + USBD_LL_OpenEP(pdev, XINPUT_EPOUT_ADDR, USBD_EP_TYPE_INTR, XINPUT_EP_SIZE); + pdev->ep_out[XINPUT_EPOUT_ADDR & 0x0FU].is_used = 1U; + + USBD_LL_OpenEP(pdev, XINPUT_SETUP_EPIN_ADDR, + USBD_EP_TYPE_INTR, XINPUT_EP_SIZE); + pdev->ep_in[XINPUT_SETUP_EPIN_ADDR & 0x0FU].is_used = 1U; + USBD_LL_OpenEP(pdev, XINPUT_SETUP_EPOUT_ADDR, + USBD_EP_TYPE_INTR, XINPUT_EP_SIZE); + pdev->ep_out[XINPUT_SETUP_EPOUT_ADDR & 0x0FU].is_used = 1U; + USBD_LL_OpenEP(pdev, XINPUT_RAW_EPIN_ADDR, + USBD_EP_TYPE_INTR, XINPUT_EP_SIZE); + pdev->ep_in[XINPUT_RAW_EPIN_ADDR & 0x0FU].is_used = 1U; + + pdev->pClassData = USBD_malloc(sizeof(USBD_XINPUT_HandleTypeDef)); + if (pdev->pClassData == NULL) + { + return USBD_FAIL; + } + + handle = (USBD_XINPUT_HandleTypeDef *)pdev->pClassData; + memset(handle, 0, sizeof(*handle)); + handle->state = XINPUT_IDLE; + rumbleLeft = 0U; + rumbleRight = 0U; + + USBD_LL_PrepareReceive(pdev, XINPUT_EPOUT_ADDR, + xinputOutBuffer, XINPUT_EP_SIZE); + + /* Stub HID data paths: unused IN endpoints naturally answer NAK. Setup OUT + * packets are accepted and discarded so Windows can start both interfaces. */ + USBD_LL_PrepareReceive(pdev, XINPUT_SETUP_EPOUT_ADDR, + xinputSetupOutBuffer, XINPUT_EP_SIZE); + return USBD_OK; +} + +static uint8_t USBD_XINPUT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + + USBD_LL_CloseEP(pdev, XINPUT_EPIN_ADDR); + pdev->ep_in[XINPUT_EPIN_ADDR & 0x0FU].is_used = 0U; + USBD_LL_CloseEP(pdev, XINPUT_EPOUT_ADDR); + pdev->ep_out[XINPUT_EPOUT_ADDR & 0x0FU].is_used = 0U; + USBD_LL_CloseEP(pdev, XINPUT_SETUP_EPIN_ADDR); + pdev->ep_in[XINPUT_SETUP_EPIN_ADDR & 0x0FU].is_used = 0U; + USBD_LL_CloseEP(pdev, XINPUT_SETUP_EPOUT_ADDR); + pdev->ep_out[XINPUT_SETUP_EPOUT_ADDR & 0x0FU].is_used = 0U; + USBD_LL_CloseEP(pdev, XINPUT_RAW_EPIN_ADDR); + pdev->ep_in[XINPUT_RAW_EPIN_ADDR & 0x0FU].is_used = 0U; + + if (pdev->pClassData != NULL) + { + USBD_free(pdev->pClassData); + pdev->pClassData = NULL; + } + + return USBD_OK; +} + +static uint8_t USBD_XINPUT_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + static uint8_t capability20[20] = + { + 0x00, 0x14, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xC0, + 0xFF, 0xC0, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + static uint8_t capability8[8] = + { + 0x00, 0x08, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00 + }; + static uint8_t status4[4] = + { + 0x28, 0x00, 0x00, 0x00 + }; + USBD_XINPUT_HandleTypeDef *handle = + (USBD_XINPUT_HandleTypeDef *)pdev->pClassData; + uint16_t statusInfo = 0U; + uint8_t interface = (uint8_t)req->wIndex; + uint8_t *descriptor = NULL; + uint16_t descriptorLength = 0U; + + if ((req->bmRequest == 0xC1U) && (req->bRequest == 0x01U) && + (req->wValue == 0x0100U) && (req->wIndex == 0x0000U) && + (req->wLength == sizeof(capability20))) + { + USBD_CtlSendData(pdev, capability20, sizeof(capability20)); + return USBD_OK; + } + + if ((req->bmRequest == 0xC1U) && (req->bRequest == 0x01U) && + (req->wValue == 0x0000U) && (req->wIndex == 0x0000U) && + (req->wLength == sizeof(capability8))) + { + USBD_CtlSendData(pdev, capability8, sizeof(capability8)); + return USBD_OK; + } + + if ((req->bmRequest == 0xC0U) && (req->bRequest == 0x01U) && + (req->wValue == 0x0000U) && (req->wIndex == 0x0000U) && + (req->wLength == sizeof(status4))) + { + USBD_CtlSendData(pdev, status4, sizeof(status4)); + return USBD_OK; + } + + /* No Microsoft OS descriptors or compatible-ID vendor request exists. */ + if ((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_CLASS) + { + USBD_CtlError(pdev, req); + return USBD_FAIL; + } + + if (((req->bmRequest & USB_REQ_TYPE_MASK) == USB_REQ_TYPE_STANDARD) && + (interface <= 2U)) + { + switch (req->bRequest) + { + case USB_REQ_GET_STATUS: + USBD_CtlSendData(pdev, (uint8_t *)&statusInfo, sizeof(statusInfo)); + return USBD_OK; + + case USB_REQ_GET_INTERFACE: + if (handle == NULL) + { + break; + } + USBD_CtlSendData(pdev, &handle->AltSetting[interface], 1U); + return USBD_OK; + + case USB_REQ_SET_INTERFACE: + if (handle == NULL) + { + break; + } + if (req->wValue == 0U) + { + handle->AltSetting[interface] = 0U; + return USBD_OK; + } + break; + + case USB_REQ_GET_DESCRIPTOR: + if ((interface == 1U) && ((req->wValue >> 8) == 0x22U)) + { + descriptor = xinputSetupReportDescriptor; + descriptorLength = sizeof(xinputSetupReportDescriptor); + } + else if ((interface == 2U) && ((req->wValue >> 8) == 0x22U)) + { + descriptor = xinputRawReportDescriptor; + descriptorLength = sizeof(xinputRawReportDescriptor); + } + else if (((interface == 1U) || (interface == 2U)) && + ((req->wValue >> 8) == 0x21U)) + { + descriptor = &USBD_XINPUT_CfgDesc[(interface == 1U) ? 58U : 90U]; + descriptorLength = 9U; + } + if (descriptor != NULL) + { + USBD_CtlSendData(pdev, descriptor, + MIN(descriptorLength, req->wLength)); + return USBD_OK; + } + break; + + default: + break; + } + } + + USBD_CtlError(pdev, req); + return USBD_FAIL; +} + +uint8_t USBD_XINPUT_SendReport(USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len) +{ + USBD_XINPUT_HandleTypeDef *handle = + (USBD_XINPUT_HandleTypeDef *)pdev->pClassData; + + if ((pdev->dev_state == USBD_STATE_CONFIGURED) && + (handle != NULL) && (handle->state == XINPUT_IDLE) && + (len == XINPUT_REPORT_SIZE)) + { + handle->state = XINPUT_BUSY; + memcpy(xinputInBuffer, report, XINPUT_REPORT_SIZE); + USBD_LL_Transmit(pdev, XINPUT_EPIN_ADDR, xinputInBuffer, len); + } + + return USBD_OK; +} + +static uint8_t USBD_XINPUT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + if ((epnum == (XINPUT_EPIN_ADDR & 0x0FU)) && + (pdev->pClassData != NULL)) + { + ((USBD_XINPUT_HandleTypeDef *)pdev->pClassData)->state = XINPUT_IDLE; + return USBD_OK; + } + return USBD_FAIL; +} + +static uint8_t USBD_XINPUT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + uint32_t length; + + if (epnum == (XINPUT_SETUP_EPOUT_ADDR & 0x0FU)) + { + /* No setup protocol is implemented. Discard data and keep the endpoint + * alive rather than halting the whole HID interface. */ + USBD_LL_PrepareReceive(pdev, XINPUT_SETUP_EPOUT_ADDR, + xinputSetupOutBuffer, XINPUT_EP_SIZE); + return USBD_OK; + } + + if (epnum != (XINPUT_EPOUT_ADDR & 0x0FU)) + { + return USBD_FAIL; + } + + length = USBD_LL_GetRxDataSize(pdev, XINPUT_EPOUT_ADDR); + if ((length == 8U) && (xinputOutBuffer[0] == 0x00U) && + (xinputOutBuffer[1] == 0x08U)) + { + rumbleLeft = xinputOutBuffer[3]; + rumbleRight = xinputOutBuffer[4]; + } + + USBD_LL_PrepareReceive(pdev, XINPUT_EPOUT_ADDR, + xinputOutBuffer, XINPUT_EP_SIZE); + return USBD_OK; +} + +uint8_t USBD_XINPUT_GetRumbleLeft(void) +{ + return rumbleLeft; +} + +uint8_t USBD_XINPUT_GetRumbleRight(void) +{ + return rumbleRight; +} + +static uint8_t *USBD_XINPUT_GetCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_XINPUT_CfgDesc); + return USBD_XINPUT_CfgDesc; +} + +static uint8_t *USBD_XINPUT_GetDeviceQualifierDesc(uint16_t *length) +{ + *length = sizeof(USBD_XINPUT_DeviceQualifierDesc); + return USBD_XINPUT_DeviceQualifierDesc; +} + +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t *USBD_XINPUT_GetUserString(USBD_HandleTypeDef *pdev, + uint8_t index, + uint16_t *length) +{ + const char *text; + UNUSED(pdev); + if (index == 0x06U) + { + text = "Setup"; + } + else if (index == 0x07U) + { + text = "Raw"; + } + else + { + *length = 0U; + return NULL; + } + USBD_GetString((uint8_t *)text, xinputStringBuffer, length); + return xinputStringBuffer; +} +#endif diff --git a/arcadestick_software/USB_DEVICE/App/usbd_xinput.h b/arcadestick_software/USB_DEVICE/App/usbd_xinput.h new file mode 100644 index 0000000..b331801 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/App/usbd_xinput.h @@ -0,0 +1,44 @@ +#ifndef USBD_XINPUT_H +#define USBD_XINPUT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" +#include "usbd_ioreq.h" + +#define XINPUT_EPIN_ADDR 0x81U +#define XINPUT_EPOUT_ADDR 0x02U +#define XINPUT_SETUP_EPIN_ADDR 0x83U +#define XINPUT_SETUP_EPOUT_ADDR 0x03U +#define XINPUT_RAW_EPIN_ADDR 0x84U +#define XINPUT_EP_SIZE 64U +#define XINPUT_REPORT_SIZE 20U +#define USB_XINPUT_CONFIG_DESC_SIZ 106U + +typedef enum +{ + XINPUT_IDLE = 0, + XINPUT_BUSY +} XINPUT_StateTypeDef; + +typedef struct +{ + uint8_t AltSetting[3]; + XINPUT_StateTypeDef state; +} USBD_XINPUT_HandleTypeDef; + +extern USBD_ClassTypeDef USBD_XINPUT; + +uint8_t USBD_XINPUT_SendReport(USBD_HandleTypeDef *pdev, + uint8_t *report, + uint16_t len); +uint8_t USBD_XINPUT_GetRumbleLeft(void); +uint8_t USBD_XINPUT_GetRumbleRight(void); + +#ifdef __cplusplus +} +#endif + +#endif /* USBD_XINPUT_H */ diff --git a/arcadestick_software/USB_DEVICE/Target/usbd_conf.c b/arcadestick_software/USB_DEVICE/Target/usbd_conf.c new file mode 100644 index 0000000..93970e6 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/Target/usbd_conf.c @@ -0,0 +1,669 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : Target/usbd_conf.c + * @version : v2.0_Cube + * @brief : This file implements the board support package for the USB device library + ****************************************************************************** + * @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 "stm32f1xx.h" +#include "stm32f1xx_hal.h" +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_hid.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +PCD_HandleTypeDef hpcd_USB_FS; +void Error_Handler(void); + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private functions ---------------------------------------------------------*/ +static USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state); +#else +void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + +/******************************************************************************* + LL Driver Callbacks (PCD -> USB Device Library) +*******************************************************************************/ +/* MSP Init */ + +void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) +{ + if(pcdHandle->Instance==USB) + { + /* USER CODE BEGIN USB_MspInit 0 */ + + /* USER CODE END USB_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USB_CLK_ENABLE(); + + /* Peripheral interrupt init */ + HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn); + /* USER CODE BEGIN USB_MspInit 1 */ + + /* USER CODE END USB_MspInit 1 */ + } +} + +void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) +{ + if(pcdHandle->Instance==USB) + { + /* USER CODE BEGIN USB_MspDeInit 0 */ + + /* USER CODE END USB_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USB_CLK_DISABLE(); + + /* Peripheral interrupt Deinit*/ + HAL_NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn); + + /* USER CODE BEGIN USB_MspDeInit 1 */ + + /* USER CODE END USB_MspDeInit 1 */ + } +} + +/** + * @brief Setup stage callback + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); +} + +/** + * @brief Data Out stage callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); +} + +/** + * @brief Data In stage callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief Reset callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_SpeedTypeDef speed = USBD_SPEED_FULL; + + if ( hpcd->Init.speed != PCD_SPEED_FULL) + { + Error_Handler(); + } + /* Set Speed. */ + USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); + + /* Reset Device. */ + USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief Suspend callback. + * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + /* Inform USB library that core enters in suspend Mode. */ + USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); + /* Enter in STOP mode. */ + /* USER CODE BEGIN 2 */ + if (hpcd->Init.low_power_enable) + { + /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ + SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); + } + /* USER CODE END 2 */ +} + +/** + * @brief Resume callback. + * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + /* USER CODE BEGIN 3 */ + + /* USER CODE END 3 */ + USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief ISOOUTIncomplete callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); +} + +/** + * @brief ISOINIncomplete callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); +} + +/** + * @brief Connect callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); +} + +/** + * @brief Disconnect callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); +} + +/******************************************************************************* + LL Driver Interface (USB Device Library --> PCD) +*******************************************************************************/ + +/** + * @brief Initializes the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) +{ + /* Init USB Ip. */ + /* Link the driver to the stack. */ + hpcd_USB_FS.pData = pdev; + pdev->pData = &hpcd_USB_FS; + + hpcd_USB_FS.Instance = USB; + hpcd_USB_FS.Init.dev_endpoints = 8; + hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; + hpcd_USB_FS.Init.low_power_enable = DISABLE; + hpcd_USB_FS.Init.lpm_enable = DISABLE; + hpcd_USB_FS.Init.battery_charging_enable = DISABLE; + if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) + { + Error_Handler( ); + } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + /* Register USB PCD CallBacks */ + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); + HAL_PCD_RegisterCallback(&hpcd_USB_FS, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); + + HAL_PCD_RegisterDataOutStageCallback(&hpcd_USB_FS, PCD_DataOutStageCallback); + HAL_PCD_RegisterDataInStageCallback(&hpcd_USB_FS, PCD_DataInStageCallback); + HAL_PCD_RegisterIsoOutIncpltCallback(&hpcd_USB_FS, PCD_ISOOUTIncompleteCallback); + HAL_PCD_RegisterIsoInIncpltCallback(&hpcd_USB_FS, PCD_ISOINIncompleteCallback); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + /* USER CODE BEGIN EndPoint_Configuration */ + /* EP0 plus endpoint table entries up to EP4 fit below 0x28. */ + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x28); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x68); + /* USER CODE END EndPoint_Configuration */ + /* USER CODE BEGIN EndPoint_Configuration_HID */ + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xA8); +#ifdef REFLEKS_XINPUT + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02 , PCD_SNG_BUF, 0xE8); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83 , PCD_SNG_BUF, 0x128); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x03 , PCD_SNG_BUF, 0x168); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x84 , PCD_SNG_BUF, 0x1A8); +#elif defined(REFLEKS_DINPUT) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0xE8); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02 , PCD_SNG_BUF, 0x128); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83 , PCD_SNG_BUF, 0x168); +#endif + /* USER CODE END EndPoint_Configuration_HID */ + return USBD_OK; +} + +/** + * @brief De-Initializes the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_DeInit(pdev->pData); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Starts the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_Start(pdev->pData); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Stops the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_Stop(pdev->pData); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Opens an endpoint of the low level driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @param ep_type: Endpoint type + * @param ep_mps: Endpoint max packet size + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Closes an endpoint of the low level driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Flushes an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Sets a Stall condition on an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Clears a Stall condition on an endpoint of the Low Level Driver. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Returns Stall condition. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval Stall (1: Yes, 0: No) + */ +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData; + + if((ep_addr & 0x80) == 0x80) + { + return hpcd->IN_ep[ep_addr & 0x7F].is_stall; + } + else + { + return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; + } +} + +/** + * @brief Assigns a USB address to the device. + * @param pdev: Device handle + * @param dev_addr: Device address + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Transmits data over an endpoint. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @param pbuf: Pointer to data to be sent + * @param size: Data size + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Prepares an endpoint for reception. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @param pbuf: Pointer to data to be received + * @param size: Data size + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +{ + HAL_StatusTypeDef hal_status = HAL_OK; + USBD_StatusTypeDef usb_status = USBD_OK; + + hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); + + usb_status = USBD_Get_USB_Status(hal_status); + + return usb_status; +} + +/** + * @brief Returns the last transferred packet size. + * @param pdev: Device handle + * @param ep_addr: Endpoint number + * @retval Received Data Size + */ +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) +{ + return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); +} + +/** + * @brief Delays routine for the USB device library. + * @param Delay: Delay in ms + * @retval None + */ +void USBD_LL_Delay(uint32_t Delay) +{ + HAL_Delay(Delay); +} + +/** + * @brief Static single allocation. + * @param size: Size of allocated memory + * @retval None + */ +void *USBD_static_malloc(uint32_t size) +{ + static uint32_t mem[(sizeof(USBD_HID_HandleTypeDef)/4)+1];/* On 32-bit boundary */ + return mem; +} + +/** + * @brief Dummy memory free + * @param p: Pointer to allocated memory address + * @retval None + */ +void USBD_static_free(void *p) +{ + +} + +/** + * @brief Software Device Connection + * @param hpcd: PCD handle + * @param state: Connection state (0: disconnected / 1: connected) + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state) +#else +void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + /* USER CODE BEGIN 6 */ + if (state == 1) + { + /* Configure Low connection state. */ + + } + else + { + /* Configure High connection state. */ + + } + /* USER CODE END 6 */ +} + +/** + * @brief Returns the USB status depending on the HAL status: + * @param hal_status: HAL status + * @retval USB status + */ +USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status) +{ + USBD_StatusTypeDef usb_status = USBD_OK; + + switch (hal_status) + { + case HAL_OK : + usb_status = USBD_OK; + break; + case HAL_ERROR : + usb_status = USBD_FAIL; + break; + case HAL_BUSY : + usb_status = USBD_BUSY; + break; + case HAL_TIMEOUT : + usb_status = USBD_FAIL; + break; + default : + usb_status = USBD_FAIL; + break; + } + return usb_status; +} diff --git a/arcadestick_software/USB_DEVICE/Target/usbd_conf.h b/arcadestick_software/USB_DEVICE/Target/usbd_conf.h new file mode 100644 index 0000000..328f918 --- /dev/null +++ b/arcadestick_software/USB_DEVICE/Target/usbd_conf.h @@ -0,0 +1,177 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_conf.h + * @version : v2.0_Cube + * @brief : Header for usbd_conf.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 __USBD_CONF__H__ +#define __USBD_CONF__H__ + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include +#include +#include +#include "main.h" +#include "stm32f1xx.h" +#include "stm32f1xx_hal.h" + +/* USER CODE BEGIN INCLUDE */ + +/* USER CODE END INCLUDE */ + +/** @addtogroup USBD_OTG_DRIVER + * @{ + */ + +/** @defgroup USBD_CONF USBD_CONF + * @brief Configuration file for Usb otg low level driver. + * @{ + */ + +/** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables + * @brief Public variables. + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines + * @brief Defines for configuration of the Usb device. + * @{ + */ + +/*---------- -----------*/ +#define USBD_MAX_NUM_INTERFACES 3 +/*---------- -----------*/ +#define USBD_MAX_NUM_CONFIGURATION 1 +/*---------- -----------*/ +#define USBD_MAX_STR_DESC_SIZ 512 +/*---------- -----------*/ +#define USBD_DEBUG_LEVEL 0 +/*---------- -----------*/ +#define USBD_SELF_POWERED 1 +/* Interface strings 6 (Setup) and 7 (Raw) are owned by the class. */ +#define USBD_SUPPORT_USER_STRING_DESC 1U +/*---------- -----------*/ +#define HID_FS_BINTERVAL 0xA + +/****************************************/ +/* #define for FS and HS identification */ +#define DEVICE_FS 0 + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros + * @brief Aliases. + * @{ + */ + +/* Memory management macros */ + +/** Alias for memory allocation. */ +#define USBD_malloc (uint32_t *)USBD_static_malloc + +/** Alias for memory release. */ +#define USBD_free USBD_static_free + +/** Alias for memory set. */ +#define USBD_memset /* Not used */ + +/** Alias for memory copy. */ +#define USBD_memcpy /* Not used */ + +/** Alias for delay. */ +#define USBD_Delay HAL_Delay + +/* For footprint reasons and since only one allocation is handled in the HID class + driver, the malloc/free is changed into a static allocation method */ +void *USBD_static_malloc(uint32_t size); +void USBD_static_free(void *p); + +/* DEBUG macros */ + +#if (USBD_DEBUG_LEVEL > 0) +#define USBD_UsrLog(...) printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_UsrLog(...) +#endif + +#if (USBD_DEBUG_LEVEL > 1) + +#define USBD_ErrLog(...) printf("ERROR: ") ;\ + printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_ErrLog(...) +#endif + +#if (USBD_DEBUG_LEVEL > 2) +#define USBD_DbgLog(...) printf("DEBUG : ") ;\ + printf(__VA_ARGS__);\ + printf("\n"); +#else +#define USBD_DbgLog(...) +#endif + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types + * @brief Types. + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype + * @brief Declaration of public functions for Usb device. + * @{ + */ + +/* Exported functions -------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CONF__H__ */ + diff --git a/arcadestick_software/arcadestick.ioc b/arcadestick_software/arcadestick.ioc new file mode 100644 index 0000000..da3bacc --- /dev/null +++ b/arcadestick_software/arcadestick.ioc @@ -0,0 +1,228 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +File.Version=6 +GPIO.groupedBy=Group By Peripherals +KeepUserPlacement=false +Mcu.CPN=STM32F103RBT6 +Mcu.Family=STM32F1 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USB +Mcu.IP4=USB_DEVICE +Mcu.IPNb=5 +Mcu.Name=STM32F103R(8-B)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC14-OSC32_IN +Mcu.Pin1=PD0-OSC_IN +Mcu.Pin10=PC4 +Mcu.Pin11=PC5 +Mcu.Pin12=PC6 +Mcu.Pin13=PC7 +Mcu.Pin14=PC8 +Mcu.Pin15=PC9 +Mcu.Pin16=PA11 +Mcu.Pin17=PA12 +Mcu.Pin18=PA13 +Mcu.Pin19=PA14 +Mcu.Pin2=PD1-OSC_OUT +Mcu.Pin20=PC10 +Mcu.Pin21=PC11 +Mcu.Pin22=VP_SYS_VS_Systick +Mcu.Pin23=VP_USB_DEVICE_VS_USB_DEVICE_HID_FS +Mcu.Pin3=PC0 +Mcu.Pin4=PC1 +Mcu.Pin5=PC2 +Mcu.Pin6=PC3 +Mcu.Pin7=PA2 +Mcu.Pin8=PA4 +Mcu.Pin9=PA5 +Mcu.PinsNb=24 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F103RBTx +MxCube.Version=6.18.1 +MxDb.Version=DB.6.0.181 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +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\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\: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\:false\:false\:true\:false\:true\:false +NVIC.USB_LP_CAN1_RX0_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA11.Mode=Device +PA11.Signal=USB_DM +PA12.Mode=Device +PA12.Signal=USB_DP +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA2.GPIOParameters=GPIO_PuPd,GPIO_Label +PA2.GPIO_Label=Select +PA2.GPIO_PuPd=GPIO_PULLUP +PA2.Locked=true +PA2.Signal=GPIO_Input +PA4.GPIOParameters=GPIO_PuPd,GPIO_Label +PA4.GPIO_Label=DINPUT +PA4.GPIO_PuPd=GPIO_PULLUP +PA4.Locked=true +PA4.Signal=GPIO_Input +PA5.GPIOParameters=GPIO_PuPd,GPIO_Label +PA5.GPIO_Label=XINPUT +PA5.GPIO_PuPd=GPIO_PULLUP +PA5.Locked=true +PA5.Signal=GPIO_Input +PC0.GPIOParameters=GPIO_PuPd,GPIO_Label +PC0.GPIO_Label=UP +PC0.GPIO_PuPd=GPIO_PULLUP +PC0.Locked=true +PC0.Signal=GPIO_Input +PC1.GPIOParameters=GPIO_PuPd,GPIO_Label +PC1.GPIO_Label=DOWN +PC1.GPIO_PuPd=GPIO_PULLUP +PC1.Locked=true +PC1.Signal=GPIO_Input +PC10.GPIOParameters=GPIO_PuPd,GPIO_Label +PC10.GPIO_Label=LB +PC10.GPIO_PuPd=GPIO_PULLUP +PC10.Locked=true +PC10.Signal=GPIO_Input +PC11.GPIOParameters=GPIO_PuPd,GPIO_Label +PC11.GPIO_Label=LT +PC11.GPIO_PuPd=GPIO_PULLUP +PC11.Locked=true +PC11.Signal=GPIO_Input +PC14-OSC32_IN.GPIOParameters=GPIO_PuPd,GPIO_Label +PC14-OSC32_IN.GPIO_Label=Start +PC14-OSC32_IN.GPIO_PuPd=GPIO_PULLUP +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Signal=GPIO_Input +PC2.GPIOParameters=GPIO_PuPd,GPIO_Label +PC2.GPIO_Label=RIGHT +PC2.GPIO_PuPd=GPIO_PULLUP +PC2.Locked=true +PC2.Signal=GPIO_Input +PC3.GPIOParameters=GPIO_PuPd,GPIO_Label +PC3.GPIO_Label=LEFT +PC3.GPIO_PuPd=GPIO_PULLUP +PC3.Locked=true +PC3.Signal=GPIO_Input +PC4.GPIOParameters=GPIO_PuPd,GPIO_Label +PC4.GPIO_Label=A +PC4.GPIO_PuPd=GPIO_PULLUP +PC4.Locked=true +PC4.Signal=GPIO_Input +PC5.GPIOParameters=GPIO_PuPd,GPIO_Label +PC5.GPIO_Label=B +PC5.GPIO_PuPd=GPIO_PULLUP +PC5.Locked=true +PC5.Signal=GPIO_Input +PC6.GPIOParameters=GPIO_PuPd,GPIO_Label +PC6.GPIO_Label=Y +PC6.GPIO_PuPd=GPIO_PULLUP +PC6.Locked=true +PC6.Signal=GPIO_Input +PC7.GPIOParameters=GPIO_PuPd,GPIO_Label +PC7.GPIO_Label=X +PC7.GPIO_PuPd=GPIO_PULLUP +PC7.Locked=true +PC7.Signal=GPIO_Input +PC8.GPIOParameters=GPIO_PuPd,GPIO_Label +PC8.GPIO_Label=RB +PC8.GPIO_PuPd=GPIO_PULLUP +PC8.Locked=true +PC8.Signal=GPIO_Input +PC9.GPIOParameters=GPIO_PuPd,GPIO_Label +PC9.GPIO_Label=RT +PC9.GPIO_PuPd=GPIO_PULLUP +PC9.Locked=true +PC9.Signal=GPIO_Input +PCC.Bar.Display=Horizontal Bar +PCC.Checker=false +PCC.Display=Plot\: All Steps +PCC.Line=STM32F103 +PCC.MCU=STM32F103R(8-B)Tx +PCC.PartNumber=STM32F103RBTx +PCC.SequenceTime=1.0 ms +PCC.SequenceTime.Unit=ms +PCC.Series=STM32F1 +PCC.Temperature=25 +PCC.Vdd=3.3 +PD0-OSC_IN.Mode=HSE-External-Oscillator +PD0-OSC_IN.Signal=RCC_OSC_IN +PD1-OSC_OUT.Mode=HSE-External-Oscillator +PD1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerLinker=GCC +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F103RBTx +ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.8.7 +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=arcadestick.ioc +ProjectManager.ProjectName=arcadestick +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_USB_DEVICE_Init-USB_DEVICE-false-HAL-false +RCC.ADCFreqValue=36000000 +RCC.AHBFreq_Value=72000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV2 +RCC.APB1Freq_Value=36000000 +RCC.APB1TimFreq_Value=72000000 +RCC.APB2Freq_Value=72000000 +RCC.APB2TimFreq_Value=72000000 +RCC.FCLKCortexFreq_Value=72000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=72000000 +RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,USBPrescaler,VCOOutput2Freq_Value +RCC.MCOFreq_Value=72000000 +RCC.PLLCLKFreq_Value=72000000 +RCC.PLLMCOFreq_Value=36000000 +RCC.PLLMUL=RCC_PLL_MUL9 +RCC.SYSCLKFreq_VALUE=72000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.TimSysFreq_Value=72000000 +RCC.USBFreq_Value=48000000 +RCC.USBPrescaler=RCC_USBCLKSOURCE_PLL_DIV1_5 +RCC.VCOOutput2Freq_Value=8000000 +USB_DEVICE.CLASS_NAME_FS=HID +USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS,MANUFACTURER_STRING,PRODUCT_STRING_HID_FS +USB_DEVICE.MANUFACTURER_STRING=ERTOtech +USB_DEVICE.PRODUCT_STRING_HID_FS=Refleks Lite +USB_DEVICE.VirtualMode=Hid +USB_DEVICE.VirtualModeFS=Hid_FS +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_USB_DEVICE_VS_USB_DEVICE_HID_FS.Mode=HID_FS +VP_USB_DEVICE_VS_USB_DEVICE_HID_FS.Signal=USB_DEVICE_VS_USB_DEVICE_HID_FS +board=custom diff --git a/arcadestick_software/cmake/gcc-arm-none-eabi.cmake b/arcadestick_software/cmake/gcc-arm-none-eabi.cmake new file mode 100644 index 0000000..c4aa98a --- /dev/null +++ b/arcadestick_software/cmake/gcc-arm-none-eabi.cmake @@ -0,0 +1,152 @@ +# This is a generic toolchain support file to support GCC target + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR arm) + +# Some target device related default GCC settings +if(CPU STREQUAL "Cortex-M0") + set(CPU_FLAGS -mcpu=cortex-m0) +elseif(CPU STREQUAL "Cortex-M0+") + set(CPU_FLAGS -mcpu=cortex-m0plus) +elseif(CPU STREQUAL "Cortex-M1") + set(CPU_FLAGS -mcpu=cortex-m1) +elseif(CPU STREQUAL "Cortex-M3") + set(CPU_FLAGS -mcpu=cortex-m3) +elseif(CPU STREQUAL "Cortex-M4") + if(FPU STREQUAL "SP_FPU") + set(CPU_FLAGS -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-m4) + endif() +elseif(CPU STREQUAL "Cortex-M7") + if(FPU STREQUAL "DP_FPU") + set(CPU_FLAGS -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard) + elseif(FPU STREQUAL "SP_FPU") + set(CPU_FLAGS -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-m7) + endif() +elseif(CPU STREQUAL "Cortex-M23") + set(CPU_FLAGS -mcpu=cortex-m23) +elseif(CPU STREQUAL "Cortex-M33") + if(FPU STREQUAL "SP_FPU") + if(DSP STREQUAL "DSP") + set(CPU_FLAGS -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-m33+nodsp -mfpu=fpv5-sp-d16 -mfloat-abi=hard) + endif() + else() + if(DSP STREQUAL "DSP") + set(CPU_FLAGS -mcpu=cortex-m33) + else() + set(CPU_FLAGS -mcpu=cortex-m33+nodsp) + endif() + endif() +elseif(CPU STREQUAL "Cortex-M35P") + if(FPU STREQUAL "SP_FPU") + if(DSP STREQUAL "DSP") + set(CPU_FLAGS -mcpu=cortex-m35p -mfpu=fpv5-sp-d16 -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-m35p+nodsp -mfpu=fpv5-sp-d16 -mfloat-abi=hard) + endif() + else() + if(DSP STREQUAL "DSP") + set(CPU_FLAGS -mcpu=cortex-m35p) + else() + set(CPU_FLAGS -mcpu=cortex-m35p+nodsp) + endif() + endif() +elseif(CPU STREQUAL "Cortex-M55") + if(FPU STREQUAL "NO_FPU") + if(MVE STREQUAL "NO_MVE") + set(CPU_FLAGS -mcpu=cortex-m55+nofp+nomve) + else() + set(CPU_FLAGS -mcpu=cortex-m55+nofp) + endif() + else() + if(MVE STREQUAL "NO_MVE") + set(CPU_FLAGS -mcpu=cortex-m55+nomve -mfloat-abi=hard) + elseif(MVE STREQUAL "MVE") + set(CPU_FLAGS -mcpu=cortex-m55+nomve.fp -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-m55 -mfloat-abi=hard) + endif() + endif() +elseif(CPU STREQUAL "Cortex-M85") + if(FPU STREQUAL "NO_FPU") + if(MVE STREQUAL "NO_MVE") + set(CPU_FLAGS -mcpu=cortex-m85+nofp+nomve) + else() + set(CPU_FLAGS -mcpu=cortex-m85+nofp) + endif() + else() + if(MVE STREQUAL "NO_MVE") + set(CPU_FLAGS -mcpu=cortex-m85+nomve -mfloat-abi=hard) + elseif(MVE STREQUAL "MVE") + set(CPU_FLAGS -mcpu=cortex-m85+nomve.fp -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-m85 -mfloat-abi=hard) + endif() + endif() +elseif(CPU STREQUAL "Cortex-A5") + if(FPU STREQUAL "DP_FPU") + set(CPU_FLAGS -mcpu=cortex-a5+nosimd -mfpu=auto -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-a5+nosimd+nofp) + endif() +elseif(CPU STREQUAL "Cortex-A7") + if(FPU STREQUAL "DP_FPU") + set(CPU_FLAGS -mcpu=cortex-a7+nosimd -mfpu=auto -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-a7+nosimd+nofp) + endif() +elseif(CPU STREQUAL "Cortex-A9") + if(FPU STREQUAL "DP_FPU") + set(CPU_FLAGS -mcpu=cortex-a9+nosimd -mfpu=auto -mfloat-abi=hard) + else() + set(CPU_FLAGS -mcpu=cortex-a9+nosimd+nofp) + endif() +endif() + +if(BYTE_ORDER STREQUAL "Little-endian") + set(CPU_FLAGS ${CPU_FLAGS} -mlittle-endian) +elseif(BYTE_ORDER STREQUAL "Big-endian") + set(CPU_FLAGS ${CPU_FLAGS} -mbig-endian) +endif() + +set(CPU_FLAGS ${CPU_FLAGS} -mthumb) + +if(SECURE STREQUAL "Secure" OR SECURE STREQUAL "Secure-only") + set(CC_SECURE -mcmse) +endif() + +# Some default GCC settings +# arm-none-eabi- must be part of path environment +set(TOOLCHAIN_PREFIX arm-none-eabi-) +set(FLAGS "-fdata-sections -ffunction-sections -Wl,--gc-sections -Wno-comment") +set(CPP_FLAGS "${FLAGS} -fno-rtti -fno-exceptions -fno-threadsafe-statics") + +set(CMAKE_C_FLAGS ${FLAGS}) +set(CMAKE_CXX_FLAGS ${CPP_FLAGS}) + +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_CXX_COMPILER ${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) + +set(CMAKE_C_FLAGS_DEBUG "") +set(CMAKE_CXX_FLAGS_DEBUG "") +set(CMAKE_ASM_FLAGS_DEBUG "") +set(CMAKE_EXE_LINKER_FLAGS_DEBUG "") + +set(CMAKE_C_FLAGS_RELEASE "") +set(CMAKE_CXX_FLAGS_RELEASE "") +set(CMAKE_ASM_FLAGS_RELEASE "") +set(CMAKE_EXE_LINKER_FLAGS_RELEASE "") \ No newline at end of file diff --git a/arcadestick_software/cmake/starm-clang.cmake b/arcadestick_software/cmake/starm-clang.cmake new file mode 100644 index 0000000..2c9046e --- /dev/null +++ b/arcadestick_software/cmake/starm-clang.cmake @@ -0,0 +1,65 @@ +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-m3 ${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 -ftls-model=local-exec -fstack-usage") + +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}/STM32F103xx_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/arcadestick_software/cmake/stm32cubemx/CMakeLists.txt b/arcadestick_software/cmake/stm32cubemx/CMakeLists.txt new file mode 100644 index 0000000..1151d8f --- /dev/null +++ b/arcadestick_software/cmake/stm32cubemx/CMakeLists.txt @@ -0,0 +1,107 @@ +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 + STM32F103xB + $<$:DEBUG> +) + +# STM32CubeMX generated include paths +set(MX_Include_Dirs + ${CMAKE_CURRENT_SOURCE_DIR}/../../USB_DEVICE/App + ${CMAKE_CURRENT_SOURCE_DIR}/../../USB_DEVICE/Target + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy + ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/STM32_USB_Device_Library/Core/Inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/CMSIS/Device/ST/STM32F1xx/Include + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/CMSIS/Include +) + +# STM32CubeMX generated application sources +set(MX_Application_Src + ${CMAKE_CURRENT_SOURCE_DIR}/../../USB_DEVICE/Target/usbd_conf.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../USB_DEVICE/App/usb_device.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../USB_DEVICE/App/usbd_desc.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/main.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/stm32f1xx_it.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/stm32f1xx_hal_msp.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/sysmem.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/syscalls.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../startup_stm32f103xb.s +) + +# STM32 HAL/LL Drivers +set(STM32_Drivers_Src + ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/Src/system_stm32f1xx.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c +) + +# Drivers Midllewares + + +set(USB_Device_Library_Src + ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c +) + +# Link directories setup +set(MX_LINK_DIRS + +) +# Project static libraries +set(MX_LINK_LIBS + STM32_Drivers + ${TOOLCHAIN_LINK_LIBRARIES} + USB_Device_Library +) +# 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) + + +# Create USB_Device_Library static library +add_library(USB_Device_Library OBJECT) +target_sources(USB_Device_Library PRIVATE ${USB_Device_Library_Src}) +target_link_libraries(USB_Device_Library 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/arcadestick_software/startup_stm32f103xb.s b/arcadestick_software/startup_stm32f103xb.s new file mode 100644 index 0000000..7614285 --- /dev/null +++ b/arcadestick_software/startup_stm32f103xb.s @@ -0,0 +1,364 @@ +/** + *************** (C) COPYRIGHT 2017 STMicroelectronics ************************ + * @file startup_stm32f103xb.s + * @author MCD Application Team + * @brief STM32F103xB Devices vector table for Atollic toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M3 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017-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. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m3 + .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 + +.equ BootRAM, 0xF108F85F +/** + * @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: + +/* 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 + .size g_pfnVectors, .-g_pfnVectors + + +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 + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN1_TX_IRQHandler + .word USB_LP_CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_IRQHandler + .word TIM1_UP_IRQHandler + .word TIM1_TRG_COM_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word BootRAM /* @0x108. This is for boot in RAM mode for + STM32F10x Medium Density devices. */ + +/******************************************************************************* +* +* 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 TAMPER_IRQHandler + .thumb_set TAMPER_IRQHandler,Default_Handler + + .weak RTC_IRQHandler + .thumb_set RTC_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_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN1_TX_IRQHandler + .thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN1_RX0_IRQHandler + .thumb_set USB_LP_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_IRQHandler + .thumb_set TIM1_BRK_IRQHandler,Default_Handler + + .weak TIM1_UP_IRQHandler + .thumb_set TIM1_UP_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_IRQHandler + .thumb_set TIM1_TRG_COM_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 USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + diff --git a/arcadestick_software/tools/package_firmware.ps1 b/arcadestick_software/tools/package_firmware.ps1 new file mode 100644 index 0000000..9e587a6 --- /dev/null +++ b/arcadestick_software/tools/package_firmware.ps1 @@ -0,0 +1,47 @@ +param( + [Parameter(Mandatory = $true)] [string] $Bootloader, + [Parameter(Mandatory = $true)] [string] $App1, + [Parameter(Mandatory = $true)] [string] $App2, + [Parameter(Mandatory = $true)] [string] $Output +) + +$ErrorActionPreference = 'Stop' + +$flashSize = 0x20000 +$bootloaderOffset = 0x00000 +$bootloaderSize = 0x06000 +$app1Offset = 0x06000 +$app1Size = 0x0D000 +$app2Offset = 0x13000 +$app2Size = 0x0D000 + +$image = [byte[]]::new($flashSize) +for ($index = 0; $index -lt $image.Length; $index++) { + $image[$index] = 0xFF +} + +function Add-FirmwareImage { + param( + [string] $Path, + [int] $Offset, + [int] $MaximumSize, + [string] $Name + ) + + $bytes = [System.IO.File]::ReadAllBytes((Resolve-Path -LiteralPath $Path)) + if ($bytes.Length -gt $MaximumSize) { + throw "$Name is $($bytes.Length) bytes; its slot is only $MaximumSize bytes." + } + + [System.Array]::Copy($bytes, 0, $image, $Offset, $bytes.Length) +} + +Add-FirmwareImage -Path $Bootloader -Offset $bootloaderOffset ` + -MaximumSize $bootloaderSize -Name 'Bootloader' +Add-FirmwareImage -Path $App1 -Offset $app1Offset ` + -MaximumSize $app1Size -Name 'XInput App1' +Add-FirmwareImage -Path $App2 -Offset $app2Offset ` + -MaximumSize $app2Size -Name 'DInput App2' + +[System.IO.File]::WriteAllBytes($Output, $image) +Write-Host "Combined 128 KB firmware image written to $Output"

Y<;d1qJ1PW8leKLkACr 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

mHTBcxW&));8dX!O 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%0ATTRa#a9`shd&xaWK4;DvcGqAH$9*CffciX%lRp0 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𝔮omzjU6%BEP^6+Mu*tg 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